Go Wiki: 范围子句

规范:https://go-lang.org.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)
}

参考

如果范围表达式的左侧只有一个值,则该值是此表中的第一项。

范围表达式 第一项 第二项(可选) 备注
数组或切片 a [n]E, *[n]E, or []E 索引 i int a[i] E
字符串 s string 类型 索引 i int Unicode 码点 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 的一部分。