メインコンテンツにスキップ
モジュール 4 · レッスン 3 / 5コース内の 18/50~12 min
モジュールのレッスン (3/5)

マップ: キーと値

マップは、キー→値のハッシュ テーブルです: map[K]V。地図は参考です タイプ: 関数に渡されると、同じストレージを共有します。そうでなければなりません 書き込む前に (make またはリテラルを使用して) 初期化されます。

創造

Go
// with a literal
prices := map[string]int{"pane": 2, "latte": 3}

// with make
counters := make(map[string]int)
counters["a"] = 1

// nil map (readable, NOT writable)
var m map[string]int
fmt.Println(m["x"])    // 0 — ok
// m["y"] = 1          // PANIC

基本操作

Go
m := map[string]int{"a": 1}

m["b"] = 2              // insert/update
v := m["a"]             // get; if missing: zero value
delete(m, "a")          // remove (ok even if the key doesn't exist)
n := len(m)             // number of entries

カンマ OK: 「欠落」と「ゼロ値」の区別

Go
v, ok := m["x"]
if !ok {
    fmt.Println("key missing")
} else {
    fmt.Println("found:", v)
}

m["x"] が返すため、これがキーが存在するかどうかを知る唯一の方法です。 キーがない場合でも値はゼロになります。基本的なパターン。

反復: ランダムな順序

Go
for k, v := range m {
    fmt.Println(k, v)
}

キー: 比較可能なタイプのみ

キーは 比較可能である必要があります: string、数値、bool、ポインター、 チャネル、インターフェイス、同等の型の配列、同等の構造体 フィールド。 スライス、マップ、関数は比較できません → 比較できません 鍵になります。

Go
m := map[[2]int]string{}   // ok: array is comparable
// m := map[[]int]string{} // ERROR: slice is not comparable

パターン: カウンター

マップの最も一般的な用途の 1 つは次のとおりです。

Go
words := []string{"a", "b", "a", "c", "b", "a"}
freq := map[string]int{}
for _, w := range words {
    freq[w]++   // access to a missing key is 0 → 0+1 = 1
}
// freq = {"a": 3, "b": 2, "c": 1}

試してみてください

運動#go.m4.l3.e1
試行回数: 0読み込み中…

値 'a' -> 1 および 'b' -> 2 を持つ map[string]int を作成し、その後 'c' -> 3 を追加します。

エディターを読み込み中…
ヒントを表示

リテラル: `map[K]V{"key": value, ...}`。

3 回の試行後に解決策が利用可能になります

運動#go.m4.l3.e2
試行回数: 0読み込み中…

カンマ OK パターンを使用して、キー 'x' (存在しない) を v に読み取り、ok し、両方を出力します。

エディターを読み込み中…
ヒントを表示

2 つの戻り値: 値と存在ブール値。

3 回の試行後に解決策が利用可能になります

Quiz#go.m4.l3.e3
準備完了

nil マップに書き込むとどうなるでしょうか?

Go
var m map[string]int
m["a"] = 1
回答の選択肢

要約

  • map[K]V: キー値、参照、ハッシュバック。
  • make またはリテラルで初期化します。 nil マップ → 書き込み時にパニック。
  • v, ok := m[k] は、「欠落」と「ゼロ値」を区別する唯一の方法です。
  • delete(m, k) は削除します。 k が存在しなくても大丈夫です。
  • range 反復: ランダム化 順序。
  • キー: 比較可能なタイプのみ (スライス/マップ/関数なし)。
  • カウンター パターン: freq[k]++ は暗黙的なゼロ値を利用します。