0
0

【Go】for rangeでmapの要素を取り出す順番

Last updated at Posted at 2024-07-13

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点を考慮された仕様のようだ。

  1. mapの順番が固定されていると仮定したコードを書くのを防ぐ
  2. マップの裏で作られるハッシュがいつも同じ対応になると、それを利用して「HashDoS」と呼ばれる攻撃が仕掛けられる危険性があるため

参考

初めてのGo言語 ―他言語プログラマーのためのイディオマティックGo実践ガイド

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0