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 的一部分。