0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Go言語(Golang)のmapをrangeでループした際の出力についての考察

Last updated at Posted at 2024-10-12

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]

これらの実装の違いは以下の点にあります:

  1. マップのイテレーション vs 直接出力:

    • 上の実装では、for k, v := range m を使ってマップの各要素をイテレートしています。
    • 下の実装では、fmt.Println(m) でマップ全体を直接出力しています。
  2. 出力の順序:

    • 上の実装:Go言語のマップは、イテレーション時に要素の順序を保証しません。そのため、毎回異なる順序で出力される可能性があります。
    • 下の実装:fmt.Println(m) はマップ全体を一度に出力します。Go 1.12以降、fmt.Println はマップをキーでソートして出力するため、常に同じ順序(昇順)で表示されます。
  3. パフォーマンスと一貫性:

    • 上の実装は各要素を個別に処理するため、大きなマップの場合はより柔軟ですが、順序が一貫しません。
    • 下の実装は常に同じ順序で出力されるため、結果が予測可能です。ただし、大きなマップの場合、ソートのオーバーヘッドが発生する可能性があります。
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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?