Go Wiki: 範圍子句
規範:https://golang.org.tw/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 的一部分。