Nil スライスと Nil インターフェイス
Go では、nil スライスは nil インターフェイスと同じではありません。この動作は、次のコードで示されています。
<code class="go">package main import "fmt" func main() { var i []int = nil yes(i) // output: true no(i) // output: false } func yes(thing []int) { fmt.Println(thing == nil) } func no(thing interface{}) { fmt.Println(thing == nil) }</code>
2 つの関数間の出力の違いは、Go がインターフェイス型を処理する方法によるものです。
インターフェイス型
Go のインターフェイス型は、特定の値型によって実装できるメソッドのコレクションです。 Interface{} 変数を使用すると、インターフェイスを実装する任意の型の任意の値を保持できます。
Nil Interface
interface{} 変数が割り当てられている場合nil に設定すると、インターフェースのデータフィールドは nil に設定されますが、type フィールドは nil に設定されません。結果として、nil インターフェースは nil と等しくありません。
Nil スライス
一方、nil スライスは単に要素を持たないスライスです。 nil スライスを nil と比較すると、スライスのデータ フィールドと型フィールドの両方が nil に設定されているため、比較は true と評価されます。
結論
したがって、コード例の 2 つの関数間の出力の違いは、nil([]int) が nil スライスであるのに対し、nil(interface{}) が nil インターフェイスであるという事実によるものです。 nil スライスは nil と比較すると true と評価されますが、nil インターフェイスは false と評価されます。
以上が`nil([]int)` は `nil` と等しいのに、`nil(interface{})` は等しくないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。