TL;DR

Go で、明示的に初期化しなかった変数や値に入る、型ごとのデフォルトの値。数値は 0、文字列は ""、真偽値は false、ポインタやスライスなどは nil になる。

仕組み

Go の言語仕様では、宣言や new で変数の領域を確保したとき、または複合リテラルや make で新しい値を作ったときに、初期値を与えなければ各要素が型のゼロ値になる。型ごとのゼロ値は次のとおりである。

この初期化は再帰的に行われるので、構造体の配列なら、各要素のフィールドもゼロ値になる。

例

言語仕様の例では、次の 2 つの宣言は同じ意味になる。

var i int
var i int = 0

構造体を new や var で作ると、すべてのフィールドがゼロ値になる。

type T struct { i int; f float64; next *T }
t := new(T) // t.i == 0, t.f == 0.0, t.next == nil

注意点

初めてのGo言語 第3章によると、マップのゼロ値は nil で、nil マップに書き込むと panic になる。一方、存在しないキーを読むと値の型のゼロ値が返る。

encoding/json/v2 の発表によると、encoding/json の v1 では、マップやスライスのゼロ値は JSON の null になる。v2 では、ゼロ値のフィールドを省略する omitzero が使える。

関連

出典