エンジニアはこわくない

好きなように書く

golangでのmap初期化に少しハマった話


スポンサーリンク

f:id:tsujitaku50:20170224131252j:plain

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[]

The Go Playground

なんにも入ってない!

勝手に初期化されて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= []

The Go Playground

ポインタなどは初期値がnil

int型は初期値が0

string型は初期値が空文字

配列は初期値が空の配列

ですね。

まとめ

mapやポインタは初期値がnilになります。

気をつけましょう。

おわり!!