マップ
マップ(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]