サイト名変更・お引越しのお知らせ

Go言語のマップの基本を解説

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言語を学習している方の参考になれば幸いです。