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 の一部です。