コンテンツにスキップ

Go/0

出典: フリー教科書『ウィキブックス(Wikibooks)』
< Go

Goにおける 数値リテラル 0 は、その文脈によって複数の意味を持ちますが、ゼロ値(zero value) としての役割が特に重要です。以下に具体的に解説します。

1. 数値リテラル 0 の基本

[編集]
  • 整数型・浮動小数点型の 0
      var i int = 0     // int型の0
      var f float64 = 0 // float64型の0.0(整数リテラルだが浮動小数点型に代入可能)
    
  • Goでは、0型推論 によって int 型として扱われますが、他の数値型(float64byte など)にも代入可能です。

2. 「ゼロ値(Zero Value)」としての 0

[編集]

Goでは、変数を宣言した時点で暗黙的に初期化される値 を「ゼロ値」と呼びます。0 は数値型のゼロ値です。

型ごとのゼロ値

[編集]
ゼロ値
int, float32, float64 0
bool false
string ""(空文字)
ポインタ nil
スライス/マップ nil
構造体 各フィールドのゼロ値

例: ゼロ値の自動初期化

[編集]
var n int      // n == 0
var s string   // s == ""
var p *int     // p == nil

3. 0 の特別な用途

[編集]

(1) スライスの初期化

[編集]
s := make([]int, 0) // 長さ0のスライス(要素はないがnilではない)
  • nil スライスと空スライスは異なりますが、len(s) == 0 は共通。

(2) マップの要素チェック

[編集]
m := map[string]int{"a": 1}
val, exists := m["b"] // val == 0(ゼロ値), exists == false
  • キーが存在しない場合、値型のゼロ値(ここでは 0)が返されます。

(3) カウンタやフラグの初期値

[編集]
count := 0 // カウンタ初期化

4. 他の言語との比較

[編集]
  • C言語: 0int 型だが、ポインタの NULLfalse と同等に扱われる(暗黙的な型変換あり)。
  • Python: 0int 型で、NoneFalse とは明確に区別される。
  • Go: 0 はあくまで数値型のゼロ値で、nil(ポインタ/参照型)や false とは独立。

5. 注意点

[編集]

ゼロ値の意図しない利用

[編集]
var timeout time.Duration // timeout == 0(0ナノ秒)
  • time.Duration0 は「無期限」を意味する場合があり、バグの原因になることがあります。

浮動小数点の 0

[編集]
var zero float64 = 0
fmt.Println(1.0 / zero) // +Inf(0除算はエラーではなく無限大)

6. まとめ

[編集]
  • Goの 0「数値型のゼロ値」 であり、言語設計の「明示性」と「安全性」を体現しています。
  • 変数の自動初期化やエッジケース(マップのキー不在など)で重要な役割を果たします。
  • 他の言語と異なり、nilfalse とは厳密に区別されるため、型システムの堅牢性に貢献しています。

0 はただの数値ではなく、Goの 『ゼロ値哲学』の象徴」と考えると、言語設計の深みが見えてきます!