33

なぜGoはタイプ nilしたのですか? 便宜上、明示的なインターフェイスのコンフォメーション チェックをスローします。untyped の問題は何ですか?nilまた、デザイナーは typed で何を解決したかったのnilですか?

4

4 に答える 4

21

It sounds like you're asking about this error message:

http://play.golang.org/p/h80rmDYCTI

package main

import "fmt"

type A struct {}
type B struct {}

func (a *A) Foo() {
    fmt.Println("A")
}

func (b *B) Foo() {
    fmt.Println("B")
}

func main() {
    n := nil
    n.Foo()
}

This prints:

prog.go:17: use of untyped nil
 [process exited with non-zero status]

In that example, should the program print "A" or "B"?

You have to help the compiler decide. The way you do that is by specifying the type of n.

For example:

http://play.golang.org/p/zMxUFYgxpy

func main() {
    var n *A
    n.Foo()
}

prints "A".

In other languages, n.Foo() might crash immediately if n is nil or its equivalent. Go's language designers decided to let you determine what should happen instead. If you access the pointer without checking for nil, you get the same behavior as in other languages.

于 2013-11-04T04:06:18.693 に答える
17

これは型安全性によるものです。nil実際には、Go の初期化されていない変数の値です。スライス、マップ、関数、チャネル、ポインター、およびインターフェイスのnil値は同じ型ではなく、比較できません。詳細については、言語仕様を参照してください。

編集: @newacctで指摘されているように、これに対する正しい技術用語は、型の「ゼロ値」です。

宣言または make または new の呼び出しによって値を格納するためにメモリが割り当てられ、明示的な初期化が提供されていない場合、メモリにはデフォルトの初期化が与えられます。そのような値の各要素は、その型のゼロ値に設定されます。ブール値の場合は false、整数の場合は 0、浮動小数点数の場合は 0.0、文字列の場合は ""、ポインター、関数、インターフェイス、スライス、チャネル、およびマップの場合は nil です。

遊び場の例

nil インターフェースとエラーに関する情報も、Why is my nil error value not equal to nil? にあります。Go FAQで。

于 2013-11-04T11:18:03.773 に答える