Go Academy · レッスン

反復処理と順序

mapのランダムな順序に対応します

レッスン 4/413 ステップ

「反復処理と順序」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。

マップの反復処理

rangeを使ってマップをループし、各キーと値を取得します。

package main

import "fmt"

func main() {
	m := map[string]int{"a": 1, "b": 2}
	for k, v := range m {
		fmt.Println(k, v)
	}
}

順序はランダム

マップの反復順序は保証されません。Goは意図的に順序をランダム化しています。同じループを2回実行しても、キーが異なる順序で出力されることがあります。

ランダム化される理由

Goが意図的に順序をランダム化するのは、開発者が特定の順序に誤って依存しないようにするためです。マップの順序に依存するコードは、いつ問題が起きてもおかしくありません。

キーだけを取得する

値を省略すると、キーだけを反復処理できます。

package main

import "fmt"

func main() {
	m := map[string]int{"a": 1, "b": 2, "c": 3}
	for k := range m {
		fmt.Println(k)
	}
}

キーの収集

安定した結果を得るには、まずキーをスライスに収集します。

package main

import "fmt"

func main() {
	m := map[string]int{"a": 1, "b": 2, "c": 3}
	keys := []string{}
	for k := range m {
		keys = append(keys, k)
	}
	fmt.Println("collected", len(keys), "keys")
}

キーのソート

収集したキーをソートしてからスライスを反復処理します。これにより、決定的で順序付けされた出力が得られます。

package main

import (
	"fmt"
	"sort"
)

func main() {
	m := map[string]int{"c": 3, "a": 1, "b": 2}
	keys := []string{}
	for k := range m {
		keys = append(keys, k)
	}
	sort.Strings(keys)
	for _, k := range keys {
		fmt.Println(k, m[k])
	}
}

順序付けされた出力のパターン

収集してからソートするパターンは、予測可能な順序でマップを出力する標準的な方法です。出力順序が重要な場合は、必ずキーをソートしてください。

整数キーのソート

同じ考え方を、sort.Intsを使った数値キーにも適用できます。

package main

import (
	"fmt"
	"sort"
)

func main() {
	m := map[int]string{3: "c", 1: "a", 2: "b"}
	keys := []int{}
	for k := range m {
		keys = append(keys, k)
	}
	sort.Ints(keys)
	for _, k := range keys {
		fmt.Println(k, m[k])
	}
}

反復中の変更

rangeループ中にキーを削除しても安全です。ただし、反復中にキーを追加すると動作は未定義になります。新しいエントリが現れることもあれば、現れないこともあります。

package main

import "fmt"

func main() {
	m := map[string]int{"a": 1, "b": 2, "c": 3}
	for k := range m {
		if k == "b" {
			delete(m, k)
		}
	}
	fmt.Println(len(m))
}

値によるソート

キーではなく値で並べるには、キーを収集してから、マップの値を読み取る比較関数でソートします。

package main

import (
	"fmt"
	"sort"
)

func main() {
	m := map[string]int{"a": 3, "b": 1, "c": 2}
	keys := []string{}
	for k := range m {
		keys = append(keys, k)
	}
	sort.Slice(keys, func(i, j int) bool {
		return m[keys[i]] < m[keys[j]]
	})
	for _, k := range keys {
		fmt.Println(k, m[k])
	}
}

順序に依存しない

重要な点は、マップの反復順序を決して仮定しないことです。順序が重要なら、キーをスライスに取り出して明示的にソートしてください。

確認問題

マップのエントリをキーのアルファベット順に出力する必要があります。正しい方法は何ですか。

まとめ

反復処理と順序:

  • マップのrangeの順序は意図的にランダムです
  • キーを収集してソートし、その後反復処理すると決定的な出力になります
  • range中の削除は安全ですが、追加は未定義です
無料で開始

AI チューターと学ぶ Go — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
51
レッスン
203

よくある質問

「反復処理と順序」レッスンは無料ですか?

はい。「反復処理と順序」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。

「反復処理と順序」で何を学びますか?

mapのランダムな順序に対応します ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Go Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「反復処理と順序」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このGo Academyレッスンでコードを書いて実行できますか?

はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. mapの内部構造
  2. 存在確認
  3. 集合としてのmap
  4. 反復処理と順序
← Go Academyに戻る