Golang のゼロ値 Nil
Jay Singh
2023年6月20日
nil
は Go プログラミング言語のゼロ値であり、よく知られた重要な事前定義された識別子です。 これは、いくつかの異なるタイプのゼロ値のリテラル表現です。
他の一般的な言語で働いたことのある初心者の Go プログラマーの多くは、nil
を他の言語の null
(または NULL
) と同等と考えるかもしれません。 これは部分的に正しいですが、Go の nil
と他の言語の null
(または NULL
) にはいくつかの違いがあります。
Golang で nil
が何を意味するかを確認するために、いくつかの例を見ていきます。
Golang でさまざまな型の nil
のサイズを確認する
すべての型の値のメモリ レイアウトは常に同じです。 型の nil
値は例外ではありません (ゼロ値を nil
と仮定します)。
nil
値のサイズは、nil
値と同じ型の non-nil
値のサイズと常に同じです。 ただし、さまざまな型の nil
値のサイズは異なる場合があります。
コード:
package main
import (
"fmt"
"unsafe"
)
func main() {
var p *struct{} = nil
fmt.Println(unsafe.Sizeof(p))
var s []int = nil
fmt.Println(unsafe.Sizeof(s))
var m map[int]bool = nil
fmt.Println(unsafe.Sizeof(m))
var c chan string = nil
fmt.Println(unsafe.Sizeof(c))
var f func() = nil
fmt.Println(unsafe.Sizeof(f))
var i interface{} = nil
fmt.Println(unsafe.Sizeof(i))
}
出力:
8
24
8
8
8
16
Golang で nil
文字列を返す
文字列値を参照するポインタ変数の型は string
です。 ポインターのゼロ値は nil
です。
コード:
package main
import (
"fmt"
)
func main() {
var data *string = nil
if data == nil {
fmt.Println(data)
}
}
出力:
<nil>
この次の例では、Golang で nil == nil
かどうかを確認します。
コード:
package main
import (
"fmt"
)
func main() {
var i *int = nil
var j *int = nil
if i == j {
fmt.Println("equal")
} else {
fmt.Println("no")
}
}
出力:
equal