Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
ゼロ値
Goでは変数を宣言した時点で型に応じた「ゼロ値」が自動的に設定されます。初期化忘れによるバグを防ぐGoの安全設計の一つです。
構文一覧
| 型 | ゼロ値 | 概要 |
|---|---|---|
| int, int8, int16, int32, int64 | 0 | 整数型のゼロ値はすべて0です。 |
| uint, uint8 (byte), uint16, uint32, uint64 | 0 | 符号なし整数型もゼロ値は0です。 |
| float32, float64 | 0.0 | 浮動小数点数のゼロ値は0.0です。 |
| complex64, complex128 | 0+0i | 複素数型のゼロ値は実部・虚部ともに0です。 |
| string | "" | 文字列のゼロ値は空文字列です。 |
| bool | false | 論理値のゼロ値はfalseです。 |
| ポインタ (*T) | nil | ポインタのゼロ値はnilです。 |
| スライス ([]T) | nil | nilスライスは長さ0で、appendが使えます。 |
| マップ (map[K]V) | nil | nilマップへの書き込みはpanicになります。 |
| チャネル (chan T) | nil | nilチャネルへの送受信はブロックし続けます。 |
| 関数 (func) | nil | 関数型のゼロ値はnilです。 |
| インターフェース | nil | インターフェースのゼロ値はnilです。 |
| struct | 各フィールドがゼロ値 | 構造体は全フィールドが各型のゼロ値で初期化されます。 |
| 配列 ([N]T) | 各要素がゼロ値 | 配列の全要素が対応する型のゼロ値で初期化されます。 |
サンプルコード
package main
import "fmt"
type Person struct {
Name string
Age int
Active bool
}
func main() {
// 基本型のゼロ値
var n int
var f float64
var s string
var b bool
fmt.Printf("int: %d, float64: %f, string: %q, bool: %v\n", n, f, s, b)
// ポインタ・スライス・マップのゼロ値
var p *int
var sl []int
var m map[string]int
fmt.Println(p, sl, m) // <nil> [] map[]
fmt.Println(p == nil, sl == nil, m == nil) // true true true
// nilスライスへのappendは安全
sl = append(sl, 1, 2, 3)
fmt.Println(sl) // [1 2 3]
// 構造体のゼロ値
var person Person
fmt.Println(person) // { 0 false}
// 条件チェックにゼロ値を活用
if person.Name == "" {
fmt.Println("名前が未設定です")
}
}
概要
ゼロ値の仕組みにより、Goでは未初期化の変数を安全に扱えます。例えば、カウンタ用の変数はゼロ値が0なので宣言直後にインクリメントしても問題ありません。
nilスライスと空スライス(『[]int{}』)は『len()』が0という点では同じですが、nilかどうかは異なります。nilマップへの書き込みはpanicになるため、マップは必ず初期化してから使ってください。
ゼロ値を活用した設計は「有用なゼロ値(useful zero value)」と呼ばれるGoのイディオムです。構造体を設計する際に、ゼロ値の状態が意味のある初期状態になるよう工夫すると、コードが簡潔になります。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。