問題
以下のエラーが出た
panic: runtime error: assignment to entry in nil map
調査
Go言語では、ほとんどの型は宣言時に初期化される。
package main import "fmt" type A struct { Foo []float64 Bar bool } func main() { var i int fmt.Printf("%+v\n", i) var s string fmt.Printf("%+v\n", s) var a A fmt.Printf("%+v\n", a) }
結果
0 {Foo:[] Bar:false}
しかし、mapだけは宣言時に初期化されない?
package main import "fmt" func main() { var m map[string]string fmt.Println(m)// map[] /* panic: runtime error: assignment to entry in nil map m["hoge"] = "fuga" fmt.Println(m) */ // 初期化すればOK m = map[string]string{} fmt.Println(m)// map[] m["hoge"] = "fuga" fmt.Println(m)// map[hoge:fuga] }
解決
- mapはちゃんと自分で初期化するべし
追記
@otiai10 一応Goの変数は必ずゼロ値で初期化されますね.mapとかsliceとかチャネルとかポインタの場合はゼロ値がnilなんですよねー http://t.co/pGjhY4e4Hy
— taku ʕ ◔ϖ◔ʔ ==Go (@tenntenn) 2014, 8月 9
勉強いたしますmm
DRY