Go言語でmapに対してforループを実行したとき、繰り返し順序はランダム(実行するたびに異なる)になるって話。
実行結果が順序に依存するような処理を書いていると、実行するたびに結果が異なるので注意!!
mapの繰り返し順序がランダムになるか
package main import ( "fmt" ) func main() { m := map[string]int{"orange": 100, "apple": 50, "banana": 30} for k, v := range m { fmt.Printf("key: %s, value: %d\n", k, v) } }
サンプルコード(Go Playground): https://play.golang.org/p/g0iOG1EbD7A
上のサンプルコードをGo Playgroundで実行してみると、実行するたびに結果が変わることを確認できる。
繰り返し順序を固定したい場合
どうしてもmapの繰り返し順序を固定したい場合は、スライスとソート(sortパッケージ)を組み合わせる。
次のようなイメージ
- キーやをソートしたスライスを用意
- このスライスをforループで繰り返し実行
- スライスのキーを使ってmapのvalueを取得
キーが文字列の場合のサンプル
package main import ( "fmt" "sort" ) func main() { m := map[string]int{"orange": 100, "apple": 50, "banana": 30} // マップのキーのスライスを作成 var keys []string for key := range m { keys = append(keys, key) } // キーをソートする sort.Strings(keys) // ソートしたキーのスライスをforループで回し、繰り返し順序を固定 for _, key := range keys { fmt.Printf("key: %s, value: %d\n", key, m[key]) } }
サンプルコード(Go Playground): https://play.golang.org/p/YknA4y4DGCT
上のサンプルコードは何回実行しても結果は同じ。
key: apple, value: 50 key: banana, value: 30 key: orange, value: 100
参考図書
Tour of Goを終えた人にオススメです!!