目次
マップとは
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) // 2lenの引数:- 第一引数:対象のマップ(ここでは
x)
- 第一引数:対象のマップ(ここでは
マップの注意点
マップ同士での比較はできない
2つのマップが同じか否かを判定するのに、==や!=を使用するとコンパイル時にエラーが発生します。
マップと比較できるのはnilだけなので、注意が必要です。
x := map[string]int // xはnilに初期化される
fmt.Println(x == nil) // true
コメント