golangでのmap初期化に少しハマった話
golangでのmap初期化に少しハマりました。
同じエラーに出会った人もいるかもしれないので、記録しておきます。
エラー
golangを書いていると、下記のエラーに出くわしました。
panic: assignment to entry in nil map
「うん??」と思ってコードをデバックしていくと原因が分かりました。
mapの初期化はnilになる
結論から言ってしまえば、mapのゼロ値はnilになるということです。
package main import "fmt" func main() { var m map[int]int fmt.Println(m) }
# 結果
map[]
なんにも入ってない!
勝手に初期化されてint型なので「0」が入っているものだと思ったのですが
どうやら違いました。
「nil」が入っているのに値を取りに行こうとして最初の
panic: assignment to entry in nil map
で落ちるようです。
知らないと誰でも一回はハマりそうですね。
他の初期化も試してみた
ついでなので他のintやstringなどの初期化も調べてみました。
package main import ( "fmt" ) func main() { var i int fmt.Println("i=",i) var s string fmt.Println("s=",s) var pi *int fmt.Println("pi=",pi) var ps *string fmt.Println("ps=",ps) var is []int fmt.Println("is=",is) var ss []string fmt.Println("ss=",ss) }
# 結果 i= 0 s= pi= <nil> ps= <nil> is= [] ss= []
ポインタなどは初期値がnil
int型は初期値が0
string型は初期値が空文字
配列は初期値が空の配列
ですね。
まとめ
mapやポインタは初期値がnilになります。
気をつけましょう。
おわり!!