1. ランダムされる例
main.go
package main
import "fmt"
func main() {
m := map[string]int{ //liststart
"a": 1,
"c": 3,
"b": 2,
}
for i := 0; i < 3; i++ {
fmt.Println("ループ", i)
for k, v := range m {
fmt.Println(k, v)
}
} //listend
}
出力結果
ループ 0
a 1
c 3
b 2
ループ 1
a 1
c 3
b 2
ループ 2
a 1
c 3
b 2
2. 昇順に出力される例
main.go
package main
import "fmt"
func main() {
m := map[string]int{
"a": 1,
"c": 3,
"b": 2,
}
for i := 0; i < 5; i++ {
fmt.Println("ループ", i)
fmt.Println(m)
}
}
出力結果
ループ 0
map[a:1 b:2 c:3]
ループ 1
map[a:1 b:2 c:3]
ループ 2
map[a:1 b:2 c:3]
ループ 3
map[a:1 b:2 c:3]
ループ 4
map[a:1 b:2 c:3]
これらの実装の違いは以下の点にあります:
-
マップのイテレーション vs 直接出力:
- 上の実装では、
for k, v := range m
を使ってマップの各要素をイテレートしています。 - 下の実装では、
fmt.Println(m)
でマップ全体を直接出力しています。
- 上の実装では、
-
出力の順序:
- 上の実装:Go言語のマップは、イテレーション時に要素の順序を保証しません。そのため、毎回異なる順序で出力される可能性があります。
- 下の実装:
fmt.Println(m)
はマップ全体を一度に出力します。Go 1.12以降、fmt.Println
はマップをキーでソートして出力するため、常に同じ順序(昇順)で表示されます。
-
パフォーマンスと一貫性:
- 上の実装は各要素を個別に処理するため、大きなマップの場合はより柔軟ですが、順序が一貫しません。
- 下の実装は常に同じ順序で出力されるため、結果が予測可能です。ただし、大きなマップの場合、ソートのオーバーヘッドが発生する可能性があります。