目次
マップとは
Go言語のmap
はキーと値のペアを持つデータ構造であり、他の言語でいう「辞書型(dictionary)」や「連想配列(associative array)」に相当します。
マップ型は次の形式のように、キーと値の間の対応関係を表現します。
map[{キーの型}]{値の型}
マップのゼロ値
Goのマップ型のゼロ値(デフォルト値)は nil
です。
var myMap map[string]int
fmt.Println(myMap == nil) // true(ゼロ値はnil)
マップの宣言方法
var
を使った宣言
var nilMap map[string]int // 初期値nil
上記の場合nipMap
は、以下のようなマップで初期値はnil
となります。
- キー:
string
- 値:
int
:=
を使った宣言
:=を使用することで、省略した形で宣言できます。
x := map[string]int{}
マップ変数の初期化方法
空のマップリテラルを使用する場合と、nilマップを指定する場合は異なる意味を持ちます。
空のマップリテラルで初期化すると、そのマップに対して読み書きの両方が可能になります。
x := map[string]int{} // 空のマップ
y := map[string]int // nilマップ
// 空のマップに対する読み書き
fmt.Println(x["abc"]) // 0
x["abc"] = 3
fmt.Println(x["abc"]) // 3
// nilマップに対する読み書き
fmt.Println(y["abc"]) // 0
y["abc"] = 3 // ←パニックになる
上記の事象より、通常はnilでマップ変数を初期化することはないです。
また、空でないマップリテラルで初期化する場合は、「キー:値」の形式で記述します。
x := map[string][]string {
"key1": []string{"value1", "value2"},
"key2": []string{"value3", "value4"},
"key3": []string{"value5", "value6"},
}
make
を使った宣言
マップのサイズがある程度予想できる場合は、サイズを指定してmake
を呼び出します。
x := make(map[string]int, 10)
makeを使って生成されたマップの要素数(length)は0で、サイズは10になります。
マップの操作
マップの読み書き
マップm
に関して、キーk
に対応する値はm[k]
で求められます。
x := map[string]int
x["key1"] = 1
カンマOKイディオム
カンマOKイディオムは、マップや型アサーションを扱う際にキーや型の存在を確認するための一般的なパターン です。
このイディオムを使うことで、「値が存在するかどうか」 を簡潔にチェックできます。
value, exists := myMap["key"]
value
- マップから取得した値(キーがない場合は型のゼロ値)
exists
- キーが存在する場合
true
、存在しない場合false
- キーが存在する場合
■具体例
x := map[string]int{
"apple": 100,
"banana": 200,
}
k, ok = x["apple"]
fmt.Println(k, ok) // 100 true
k, ok = x["banana"]
fmt.Println(k, ok) // 200 true
k, ok = x["lemon"]
fmt.Println(k, ok) // 0 false
マップからの削除(delete)
組み込み関数のdelete
を使うことで、キーと値のペアをマップから削除できます。
x := map[string]int{
"apple": 100,
"banana": 200,
}
delete(x, "apple")
delete
の引数:- 第一引数:削除対象のマップ(ここでは
x
) - 第二引数:削除対象のキー(ここでは
apple
)
- 第一引数:削除対象のマップ(ここでは
マップのキー数(len)
len()
関数を使うと、マップに登録されているキーの数を取得できます。
x := map[string]int{
"apple": 100,
"banana": 200,
}
num := len(x) // 2
len
の引数:- 第一引数:対象のマップ(ここでは
x
)
- 第一引数:対象のマップ(ここでは
マップの注意点
マップ同士での比較はできない
2つのマップが同じか否かを判定するのに、==
や!=
を使用するとコンパイル時にエラーが発生します。
マップと比較できるのはnil
だけなので、注意が必要です。
x := map[string]int // xはnilに初期化される
fmt.Println(x == nil) // true
コメント