ホームページ > バックエンド開発 > Golang > Nil エラーインスタンスが Nil と比較できないのはなぜですか?

Nil エラーインスタンスが Nil と比較できないのはなぜですか?

Barbara Streisand
リリース: 2024-10-30 06:51:28
オリジナル
1027 人が閲覧しました

Why Does a Nil Error Instance Not Compare as Nil?

Nil エラー インスタンスが 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 nil"
}</code>
ログイン後にコピー

ここでは、g が nil であるため、「Error is not nil」が期待されます。ただし、インターフェイスの比較により、「エラーは nil」になります。これは、(*Goof)(nil) の型が error(nil) とは異なるためです。

これを解決するには、var g *Goof の代わりに var err error を宣言できます。あるいは、関数がエラーを返した場合は、単純に nil を返します。

さらに詳しく説明すると、インターフェイスの比較では、型がインターフェイスを実装しているかどうかではなく、型が同一であるかどうかがチェックされます。そのため、次の例は、基になるデータが同じである非 nil インターフェースであっても、型が異なるために比較が不等である可能性があることを示しています。

<code class="go">package main

import "fmt"

type Bob int

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

以上がNil エラーインスタンスが Nil と比較できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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