Go Wiki: Range句

仕様: https://go.dokyumento.jp/ref/spec#For_statements

要約

range句は、配列、スライス、文字列、マップ、またはチャネルを反復処理する方法を提供します。

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)
}

参照

range式の左側に1つの値のみが使用されている場合、それはこのテーブルの1番目の値です。

Range式 1番目の値 2番目の値 (オプション) 注釈
配列またはスライス a [n]E, *[n]E, または []E インデックス i int a[i] E
文字列 s 文字列型 インデックス i int rune 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の一部です。