0Pricing
Go Academy · レッスン

マップ:キーと値のストア

マップ要素の作成、読み取り、書き込み、削除

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

マップとは

Go のマップは、キーと値のペアを格納する順序なしのコレクションです。キーには比較可能な型(文字列や整数など)を使用する必要があります。マップはハッシュテーブルによってバッキングされる参照型です。

マップの作成

リテラルまたは make を使用します。

package main
import "fmt"

func main() {
    ages  := map[string]int{"Alice": 30, "Bob": 25}
    cache := make(map[string]string)
    fmt.Println(ages, cache)
}

読み取りと書き込み

m[key] で値にアクセスし、m[key] = value で代入します。存在しないキーを読み取ると、ゼロ値が返されます。

package main
import "fmt"

func main() {
    m := map[string]int{}
    m["hits"] = 10
    m["hits"]++
    fmt.Println(m["hits"])    // 11
    fmt.Println(m["missing"]) // 0
}

キーの存在確認

2値形式を使用すると、キーが存在しない場合とゼロ値の場合を区別できます。

package main
import "fmt"

func main() {
    m := map[string]int{"a": 0}
    v, ok := m["a"]
    fmt.Println(v, ok) // 0 true
    v2, ok2 := m["z"]
    fmt.Println(v2, ok2) // 0 false
}

エントリの削除

組み込みの delete 関数を使用します。存在しないキーを削除しても何も起こりません。

package main
import "fmt"

func main() {
    m := map[string]int{"x": 1, "y": 2}
    delete(m, "x")
    delete(m, "z") // no-op
    fmt.Println(m) // map[y:2]
}

マップの反復処理

range を使用して反復処理します。順序は保証されません。

package main
import "fmt"

func main() {
    scores := map[string]int{"Alice": 90, "Bob": 85}
    for name, score := range scores {
        fmt.Printf("%s: %d\n", name, score)
    }
}

構造体を値に持つマップ

マップの値として構造体を格納できます。マップ内の構造体はアドレス指定できないため、一時変数を使って更新します。

package main
import "fmt"

type Point struct{ X, Y int }

func main() {
    points := map[string]Point{"A": {1, 2}}
    p := points["A"]
    p.X = 99
    points["A"] = p
    fmt.Println(points["A"]) // {99 2}
}

nil マップ

nil マップは空のマップと同様に読み取れます(ゼロ値が返ります)が、nil マップへの書き込みは panic になります。

package main

func main() {
    var m map[string]int
    _ = m["key"]   // ok — returns 0
    // m["key"] = 1 // PANIC: assignment to nil map
}

マップは並行利用に安全ではない

Go の組み込みマップは goroutine セーフではありません。読み取りの同時実行は問題ありませんが、書き込みの同時実行(または読み取りと書き込みの同時実行)にはミューテックスまたは sync.Map が必要です。

package main
import "sync"

func main() {
    var mu sync.Mutex
    m := map[string]int{}
    mu.Lock()
    m["key"] = 1
    mu.Unlock()
    _ = m
}

出現頻度のカウント

出現回数を数える、マップの典型的なパターンです。

package main
import "fmt"

func main() {
    words := []string{"go", "is", "fast", "go", "is", "go"}
    freq := map[string]int{}
    for _, w := range words {
        freq[w]++
    }
    fmt.Println(freq) // map[fast:1 go:3 is:2]
}

簡単な確認

Go のマップで存在しないキーを読み取ると、どうなりますか。

まとめ:マップ

主なポイントは次のとおりです。

  • マップは順序なしのキーと値のストアです
  • キーの存在を確認するには2値形式を使用します
  • nil マップには決して書き込まないでください
  • 反復順序はランダムであるため、必要に応じてキーをソートしてください
  • 並行処理のコードでは、ミューテックスでマップを保護してください

練習課題

文字列を受け取り、各文字の出現回数を数える map[rune]int を返す関数を作成してください。文字列 "hello" を使ってテストしてください。

よくある質問

「マップ:キーと値のストア」レッスンは無料ですか?

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

「マップ:キーと値のストア」で何を学びますか?

マップ要素の作成、読み取り、書き込み、削除 ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「マップ:キーと値のストア」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

  1. 配列:固定長のコレクション
  2. スライス:動的なリスト
  3. マップ:キーと値のストア
  4. rangeによるコレクションの反復
← Go Academyに戻る