Go言語のマップ(map)の基本について解説します。
mapは、連想配列に似ているデータ構造で、keyとvalueがセットになっているものです。
この記事でわかること
- Go言語のmapの基本がわかる
バージョン
- Go 1.17
定義方法
定義方法は主に2つあります。
var
を使うケースと:=
(省略変数宣言)で説明します。
makeを使わずに定義
var m map[int]string
fmt.Printf("%v", m)
// 出力結果
map[]
var m2 = map[int]string{}
fmt.Printf("%v", m2)
// 出力結果
map[]
m3 := map[int]string{1: "Go", 2: "PHP", 3: "Ruby"}
fmt.Printf("%v", m3)
// 出力結果
map[1:Go 2:PHP 3:Ruby]
makeを使って定義
メモ
makeの2番目の引数には、「要素数に対応した初期スペース」を整数で指定できます。
これはスライスのcapacityとは異なるものであり、メモリ領域を確保する情報のようなものです。
要素数が多い場合のマップでパフォーマンスの向上ができる可能性がありますが、小さい要素数では指定の必要はありません。
var m4 = make(map[int]string)
fmt.Printf("%v", m4)
// 出力結果
map[]
m5 := make(map[int]string, 100)
fmt.Printf("%v", slice5)
// 出力結果
map[]
// 組み込み関数のlenで要素数を取得できる
fmt.Println(len(m4)) // 0
モグモグさん
定義の例では、int
型をキーにして、string
型を値として定義しましたが、キーと値は関数型と参照型を除く任意の型を定義できます。
要素へのアクセス
要素へのアクセスは、キーの値を使ってアクセスします。
m := map[int]string{1: "Go", 2: "PHP", 3: "Ruby"}
fmt.Println(m[1])
fmt.Println(m[3])
// 出力結果
Go
Ruby
m2 := map[string]int{"Hokkaido": 1, "Okinawa": 47}
fmt.Println(m2["Hokkaido"])
fmt.Println(m2["Okinawa"])
// 出力結果
1
47
要素を追加・更新
キーと値のセットで要素を追加・更新します。
メモ
キーがすでに存在する場合は上書きされます。
m := map[string]string{}
m["a"] = "A"
m["b"] = "B"
fmt.Printf("%v", m)
// 出力結果
map[a:A b:B]
要素を削除
delete
を使って要素を追加
m := map[int]string{1: "A", 2: "B"}
delete(m, 2)
fmt.Println(m)
// 出力結果
map[1:A]
mapのキーと値を全て取得
全て取得するには、for range
を使います。
モグモグさん
スライスでもよく使われる書き方です。
m := map[int]string{
1: "Baseball",
2: "Soccer",
3: "Golf",
}
for k, v := range m {
fmt.Printf("key: %d, value: %s\n", k, v)
}
// 出力結果
key: 1, value: Baseball
key: 2, value: Soccer
key: 3, value: Golf
まとめ
Go言語のマップ(map)の基本について解説しました。
Go言語を学習している方の参考になれば幸いです。