はじめに
Go言語でキーがint型、バリューがbool型のマップを作成したいです。初期化時は空で生成し、値は後から追加していきます。
初期化して値を追加したらエラーになりました。
var m map[int]bool
m[1] = true
# エラー
panic: assignment to entry in nil map
# 日本語訳「パニック: nil マップのエントリへの代入」
原因:マップが初期化されていない
var m map[int]bool
で初期化したつもりでしたが、これは宣言しただけでまだ初期化されていません。
なのでmはnilの状態です。nilのマップに値を追加しようとすると上記のようなエラーになります。
var m map[int]bool
fmt.Println(m == nil) // true
対策:マップを正しく初期化する
初期化方法は3種類あります。
方法1:make関数を利用
m := make(map[int]bool)
// 確認
fmt.Println(m == nil) // false
m[1] = true
fmt.Println(m) // map[1:true]
方法2:宣言と同時に空のリテラルで初期化
m := map[int]bool{}
// 確認
fmt.Println(m == nil) // false
m[1] = true
fmt.Println(m) // map[1:true]
方法3:宣言後に改めて空のリテラルで初期化
これももちろんできますが、冗長ですね。
var m map[int]bool
m = map[int]bool{}
// 確認
fmt.Println(m == nil) // false
m[1] = true
fmt.Println(m) // map[1:true]
終わりに
Goはまだまだ基礎でつまづくことが多いですが、1つ1つ丁寧に調べて理解して慣れていきたいです。