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