マップ:キーと値のストア
マップ要素の作成、読み取り、書き込み、削除
「マップ:キーと値のストア」は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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 配列:固定長のコレクション
- スライス:動的なリスト
- マップ:キーと値のストア
- rangeによるコレクションの反復