Golang のゼロ値 Nil

Jay Singh 2023年6月20日
  1. Golang でさまざまな型の nil のサイズを確認する
  2. Golang で nil 文字列を返す
Golang のゼロ値 Nil

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