nil スライスをインターフェースと比較すると、nil スライスを nil と直接比較する場合とは異なる結果が生じるのはなぜですか?{}

Barbara Streisand
リリース: 2024-11-05 05:59:02
オリジナル
660 人が閲覧しました

Why does comparing a nil slice to an interface{} result in a different outcome than directly comparing a nil slice to nil?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート