ホームページ > バックエンド開発 > Golang > エラーインターフェイスを満たす構造体の nil インスタンスが nil と等しくないのはなぜですか?

エラーインターフェイスを満たす構造体の nil インスタンスが nil と等しくないのはなぜですか?

Susan Sarandon
リリース: 2024-10-31 07:50:30
オリジナル
928 人が閲覧しました

Why does a nil instance of a struct that satisfies the error interface not compare equal to nil?

Nil Nil インターフェース比較パズル

エラーインターフェースを満たしているにもかかわらず、nil インスタンスを持つ構造体は動作しませんnil と比較すると予想どおりです。

質問:

次のコードが「Error is nil」を出力しないのはなぜですか?

<code class="go">type Goof struct {}

func (goof *Goof) Error() string {
    return fmt.Sprintf("I'm a goof")
}

func TestError(err error) {
    if err == nil {
        fmt.Println("Error is nil")
    } else {
        fmt.Println("Error is not nil")
    }
}

func main() {
    var g *Goof // nil
    TestError(g) // expect "Error is not nil"
}</code>
ログイン後にコピー

答え:

Go では、インターフェイスの比較では型と値の両方が考慮されます。 Goof 型は error インターフェースを実装しますが、Goof (*Goof)(nil) の nil インスタンスは、 error(nil).

解決策:

これに対処するには、次のいずれかのアプローチを採用できます:

  • エラー エラーを宣言するvar g *Goof の代わりに。これにより、err がエラー タイプのゼロ値、つまり nil に初期化されます。
  • エラーを返す関数では、暗黙的に残すのではなく、明示的に nil を返します。

詳細については、以下の拡張応答を参照してください。

拡張応答:

インターフェイス値は、タイプと a の 2 つのコンポーネントで構成されます。動的な値。 nil インターフェース値には、nil 型と nil 値の両方が含まれます。この場合、(*Goof)(nil) は非 nil 型 (Goof) ですが、値は nil です。

さらに、Go の等価演算子 (==) は型の同一性を厳密にチェックします。したがって、(*Goof)(nil) と error(nil) の比較は、型が異なるため失敗します。

この動作は、Go の他の型チェックと一致しています。たとえば、次のコードでは、基になるデータは同じ (3) ですが、変数の型が異なるため、インターフェイスに格納すると不等号が生じます:

<code class="go">var x int = 3
var y Bob = 3
var ix, iy interface{} = x, y
fmt.Println(ix == iy) // false</code>
ログイン後にコピー

以上がエラーインターフェイスを満たす構造体の nil インスタンスが nil と等しくないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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