Go Wiki: 範囲節
仕様: https://go.dokyumento.jp/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つの値のみが使用される場合、それはこの表の最初の値です。
範囲式 | 最初の値 | 2番目の値(オプション) | 備考 |
---|---|---|---|
配列またはスライス a [n]E 、*[n]E 、または []E |
インデックス i int |
a[i] E |
|
文字列 s 文字列型 | インデックス i int |
ルーン int |
range はバイトではなく 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 の一部です。