mapの要素をfor rangeで取得する時、取得する要素の順番は必ずしもmapに定義した要素順になる訳ではないらしい。
m := map[string]int{
"a": 1,
"b": 2,
"c": 3,
"d": 4,
}
for i := 0; i < 5; i++ {
fmt.Println("ループ", i)
for k, v := range m {
fmt.Println(k, v)
}
}
実行結果は以下のようになる。
ループ 0
d 4
a 1
b 2
c 3
ループ 1
a 1
b 2
c 3
d 4
ループ 2
b 2
c 3
d 4
a 1
ループ 3
a 1
b 2
c 3
d 4
ループ 4
a 1
b 2
c 3
d 4
この使用は以下の2点を考慮された仕様のようだ。
- mapの順番が固定されていると仮定したコードを書くのを防ぐ
- マップの裏で作られるハッシュがいつも同じ対応になると、それを利用して「HashDoS」と呼ばれる攻撃が仕掛けられる危険性があるため