反復処理と順序
mapのランダムな順序に対応します
「反復処理と順序」は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フィードバックを取得できます。ローカル設定は不要です。