Go Wiki:范围子句

规范:https://golang.ac.cn/ref/spec#For_statements

摘要

范围子句提供了一种遍历数组、切片、字符串、映射或通道的方法。

示例

for k, v := range myMap {
    log.Printf("key=%v, value=%v", k, v)
}

for v := range myChannel {
    log.Printf("value=%v", v)
}

for i, v := range myArray {
    log.Printf("array value at [%d]=%v", i, v)
}

参考

如果在范围表达式的左侧仅使用一个值,则该值是此表中的第 1 个值。

范围表达式 第 1 个值 第 2 个值(可选) 注释
数组或切片 a [n]E*[n]E[]E 索引 i int a[i] E
字符串 s 字符串类型 索引 i int 符文 int 范围遍历 Unicode 代码点,而不是字节
映射 m map[K]V k K m[k] V
通道 c chan E 元素 e E

陷阱

在遍历值切片或映射时,可以尝试以下操作

items := make([]map[int]int, 10)
for _, item := range items {
    item = make(map[int]int, 1) // Oops! item is only a copy of the slice element.
    item[1] = 2                 // This 'item' will be lost on the next iteration.
}

make 和赋值看起来似乎可以工作,但 range 的值属性(在此处存储为 item)是 items 中值的副本,而不是 items 中值的指针。以下操作可以正常工作

items := make([]map[int]int, 10)
for i := range items {
    items[i] = make(map[int]int, 1)
    items[i][1] = 2
}

此内容是 Go Wiki 的一部分。