Nil スライスをインターフェイスに渡す: 謎を解く
Go では、nil スライスと nil インターフェイスの値を区別できます。{}予期せぬ結果をもたらします。次のプレイグラウンドの抜粋を考えてみましょう:
<code class="go">package main import "fmt" func main() { var i []int = nil yes(i) // true no(i) // false } func yes(thing []int) { fmt.Println(thing == nil) } func no(thing interface{}) { fmt.Println(thing == nil) }</code>
これらの関数はなぜ異なる出力を生成するのですか?
インターフェースについて{}
インターフェース変数{} type と data という 2 つのフィールドを持つ構造体に似ています。この場合、それは {[]int (type), nil (data)} のように見えます。
Nil Slice vs. Nil Interface
はい、nil です。スライスは直接渡されます。比較では、nil が nil に等しいかどうかがチェックされ、true と評価されます。
no では、nil スライスはインターフェイス{}でラップされ、結果は {[]int (type), nil (data)} になります。このインターフェースを nil と比較すると、型が nil であるかどうかがチェックされますが、そうではない場合があります。したがって、出力は false になります。
違いの理由
この動作は、インターフェイスが型と値の両方をカプセル化するという事実に起因します。インターフェースを nil と比較すると nil 型がチェックされますが、基礎となるデータ値の比較は異なります。 no の場合、型は nil ではないため、比較は false を返します。
結論
一見矛盾した動作は、nil スライス間の微妙な違いによるものです。そしてインターフェイスはありません。 Go でインターフェイスを操作する際の混乱を避けるためには、この区別を理解することが重要です。
以上がnil スライスをインターフェースと比較すると、nil スライスを nil と直接比較する場合とは異なる結果が生じるのはなぜですか?{}の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。