ホームページ  >  記事  >  バックエンド開発  >  Go で「nil」インターフェイス値が「error(nil)」と等しくないのはなぜですか?

Go で「nil」インターフェイス値が「error(nil)」と等しくないのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-30 18:45:30613ブラウズ

Why Does `nil` Interface Value Not Equal `error(nil)` in Go?

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) // Displays "Error is not nil"
}</code>

驚くべきことに、このコードの結果は " nil 条件をテストするつもりにもかかわらず、エラーは nil ではありません。

この動作を理解する鍵は、Go がインターフェイスを実装する方法にあります。内部的には、インターフェイス値は型と値で構成されます。値が nil であっても、型が nil になることはありません。指定された例では、(*Goof)(nil) は型「*Goof」と nil 値を持つインターフェイス値です。

ただし、エラー インターフェイスの型は "*Goof" 型とは異なります。したがって、(*Goof)(nil) と error(nil) は、両方とも nil 値を含んでいるとしても、等しくありません。これは次のコードから明らかです。

<code class="go">var g *Goof // nil
var e error = g

if e == nil {
    fmt.Println("Error is nil")
} else {
    fmt.Println("Error is not nil")
}
// Output: Error is not nil</code>

この問題を解決するには、複数のアプローチがあります。

  1. var g *Goof の代わりに var err error を err のゼロとして宣言します。値は便宜的に error(nil) です。
  2. 関数がエラーを返した場合、return nil を使用すると、必要な nil インターフェイス値が返されます。

以上がGo で「nil」インターフェイス値が「error(nil)」と等しくないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。