Go言語

【Go言語】mapのforループの繰り返し順序はランダム(サンプルコード付)

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を終えた人にオススメです!!

-Go言語

© 2021 フリエン生活 Powered by AFFINGER5