なぜGoはタイプ nil
したのですか? 便宜上、明示的なインターフェイスのコンフォメーション チェックをスローします。untyped の問題は何ですか?nil
また、デザイナーは typed で何を解決したかったのnil
ですか?
4 に答える
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.
これは型安全性によるものです。nil
実際には、Go の初期化されていない変数の値です。スライス、マップ、関数、チャネル、ポインター、およびインターフェイスのnil
値は同じ型ではなく、比較できません。詳細については、言語仕様を参照してください。
編集: @newacctで指摘されているように、これに対する正しい技術用語は、型の「ゼロ値」です。
宣言または make または new の呼び出しによって値を格納するためにメモリが割り当てられ、明示的な初期化が提供されていない場合、メモリにはデフォルトの初期化が与えられます。そのような値の各要素は、その型のゼロ値に設定されます。ブール値の場合は false、整数の場合は 0、浮動小数点数の場合は 0.0、文字列の場合は ""、ポインター、関数、インターフェイス、スライス、チャネル、およびマップの場合は nil です。
nil インターフェースとエラーに関する情報も、Why is my nil error value not equal to nil? にあります。Go FAQで。