ゼロ値(Goならでは)
初期化しない変数にも値が入っている
Go
var count int
var name string
var sold bool値を書いていません。ではこの3つには何が入っているのでしょうか。
プレーンテキスト
count 0
name ""(空文字)
sold false型ごとに決まった初期値が入ります。これを ゼロ値 と言います。
未定義が無いということ
他の多くの言語には、undefined や null のような「まだ何も入っていない」状態があります。Go にはそれがありません。宣言した瞬間に、必ず何かが入っています。
この違いは、書くコードの形を変えます。
プレーンテキスト
他の言語 まず「値が入っているか」を確かめてから使う
Go いきなり使える。0 や "" として扱える合計を出すコードが分かりやすい例です。
Go
var total int // 0 から始まる
for _, p := range prices {
total += p
}total = 0 と書く必要がありません。最初から 0 だからです。
主な型のゼロ値
プレーンテキスト
int 0
float64 0
string ""
bool false覚え方は「何も無い状態を、その型で表すとどうなるか」です。数なら 0、文字なら空、真偽なら false。素直な並びになっています。
落とし穴もある
便利な一方で、書き忘れに気づきにくいという面があります。
Go
var price int
// ここで price に値を入れるのを忘れた
fmt.Println(price) // 0 と表示される。エラーにはならない他の言語なら undefined が出て異変に気づけますが、Go では 0 として静かに進みます。
0 が正しい 0 なのか、入れ忘れた 0 なのかは区別できません。この区別が要る場面では、第4章でやる「値とエラーを一緒に返す」書き方を使います。ゼロ値の便利さと、この曖昧さは表と裏です。
要件
"int"を渡したら0を返す"float64"を渡したら0を返す"string"を渡したら空文字を返す"bool"を渡したらfalseを返す- そのどれでもないときは
分かりませんを返す
入出力例
zeroValueOf("int") → "0"
zeroValueOf("float64") → "0"
zeroValueOf("string") → "空文字"
zeroValueOf("bool") → "false"
zeroValueOf("byte") → "分かりません"ヒント
編集 ゆめさく編集部