web-dev-qa-db-ja.com

golangでnilはどういう意味ですか?

Golangではnilを使用する場合が多くあります。例えば:

func (u *URL) Parse(ref string) (*URL, error) {
    refurl, err := Parse(ref)
    if err != nil {
        return nil, err
    }
    return u.ResolveReference(refurl), nil
}

しかし、次のように使用することはできません。

var str string //or var str int
str = nil

golangコンパイラはcan't use nil as type string in assignmentエラーをスローします。

nilは、構造体とインターフェイスのポインターにのみ使用できるようです。その場合、-それはどういう意味ですか?および他のオブジェクトと比較するとき、どのように比較しますか、つまりgolangは1つのオブジェクトをどのように決定しますかnil

編集:たとえば、インターフェースがnilの場合、そのタイプと値は同時にnilでなければなりません。golangはこれをどのように行うのですか?

32
starkshang

Goでは、nilポインター、インターフェイス、マップ、スライス、チャネル、および関数タイプのゼロ値であり、uninitialized値。

nilは何らかの「未定義」状態を意味するものではなく、それ自体が適切な値です。 Goのオブジェクトは、その値がnilである場合にのみ、nilです。これは、前述のタイプのいずれかである場合のみ可能です。

errorはインターフェイスなので、nilとは異なり、stringは1つの有効な値です。明らかな理由により、nilエラーはエラーなしを表します。

77
Aedolon

Goのnilは、単に他の言語のNULLポインター値です。

ポインターまたはインターフェイスの代わりに効果的に使用できます(インターフェイスはややポインターです)。

エラータイプはインターフェイスです であるため、エラーとして使用できます。

Goでは文字列は値であるため、文字列として使用することはできません。

nilはGoでは型指定されていません。つまり、次のことはできません。

var n = nil

ここではnの型が不足しているためです。ただし、できます

var n *Foo = nil

nilはポインターとインターフェイスのゼロ値であり、初期化されていないポインターとインターフェイスはnilになります。

5
Elwinar
  • 他の型を「参照」するスライスやポインターなどのデータ型の場合、「nil」は変数がインスタンスを参照しないことを示します(他の言語のnullポインターに相当)
  • 型関数、マップ、インターフェイス、チャネル、構造の変数のゼロ値
0