マップ

マップ(map)は、キーと値のペアを集めて格納したものです。

  • マップの値を一意に識別するものを『キー』と呼ぶ
  • マップの長さは可変
  • マップの型にはキーの型と値の型を含む
  • マップの型には長さを含まない(例:map[int]int

マップの宣言と初期化

これはstring型のキーとint型の値のペアを格納するマップを宣言したものです。

// 形式: var 変数名 map[キーの型]値の型
var a map[string]int

マップの宣言と代入を一緒にできます。

// 形式: var 変数名 = map[キーの型]値の型{初期キー1: 初期値1, 初期キー2: 初期値2...}
var a = map[string]int{"x": 2, "y": 3}
// varの代わりに:=を使用
b := map[string]int{"x": 2, "y": 3}

初期値が決まっていない場合は、make関数を使ったマップの宣言と代入もできます。 引数にはmake(型, スペース)を指定します。スペースはマップのデータ領域の大きさを決めるための参考値で、省略できます。

a := make(map[string]int)    // {}
b := make(map[string]int, 3) // {} スペース:3

マップのゼロ値

マップのゼロ値はnilです。

var a map[string]int // a == nil

マップの操作

配列の要素を操作したり、配列全体をコピーできます。

  • マップの要素を取得/設定するには[]の中にキーを指定
  • マップの要素を削除するにはdelete関数を使用
  • マップの要素が存在確認は、マップの要素を2つの変数に代入して2つ目の変数で確認できる
  • マップの長さはlen関数で確認できる
  • マップを別の変数に代入すると同一のマップを参照する

対応するサンプルコードを次に示します。

a := map[string]int{}
// マップの要素を設定
a["x"] = 2
a["y"] = 3
// マップの要素を取得
fmt.Println(a["x"]) // 2
fmt.Println(a["y"]) // 3
fmt.Println(a["z"]) // 0
// マップの要素を削除
delete(a, "y")
fmt.Println(a) // map[x:2]
// キーの存在確認
v, ok := a["x"]
fmt.Println(v, ok) // 2 true
v, ok = a["z"]
fmt.Println(v, ok) // 0 false
// マップの長さを取得
fmt.Println(len(a)) // 1

マップをコピーする方法

マップを別の変数に代入すると、代入元と代入先で同一のマップを扱うことになります。

別物のマップとしてコピーするには、for文を使ってコピーします。

a := map[string]int{"x": 1, "y": 2}

// マップの代入(参照コピー)
var b map[string]int
b = a
// bの操作がaに影響する(aとbは同一)
b["x"] = 3
fmt.Println(a) // map[x:3 y:2]
fmt.Println(b) // map[x:3 y:2]

// マップの各要素をコピー
c := map[string]int{}
for k, v := range a {
    c[k] = v
}
// cの操作がaに影響しない(aとcは別物)
c["x"] = 5
fmt.Println(a) // map[x:3 y:2]
fmt.Println(c) // map[x:5 y:2]