Go で nil インターフェースと `nil` の比較が失敗するのはなぜですか?

Barbara Streisand
リリース: 2024-10-30 11:38:03
オリジナル
738 人が閲覧しました

Why does comparing a nil interface with `nil` fail in Go?

Go のインターフェイスと型の比較

Go では、インターフェイスは、さまざまな型が実装できるメソッドの共通セットを定義する方法を提供します。ただし、予期しない動作を回避するには、インターフェイスの比較がどのように機能するかを理解することが重要です。

次のコードを考えてみましょう:

<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>
ログイン後にコピー

この例では、エラー インターフェイスを実装するカスタム タイプ Goof を作成します。 。次に、*Goof 型の nil ポインターを、エラーを予期する関数 TestError に渡します。直観に反しますが、プログラムは「エラーは nil ではありません」を出力しません。

これは、インターフェイスの比較では値だけでなく型もチェックされるためです。この場合、*Goof の nil インスタンスはエラー インターフェイスとは異なるタイプになります。したがって、比較 err == nil は失敗します。

この問題を解決するには、いくつかのオプションがあります。 1 つは、err を error 型の変数として直接宣言することです:

<code class="go">var err error = g</code>
ログイン後にコピー

もう 1 つのオプションは、エラーが発生した場合に関数から nil を返すことです:

<code class="go">func MyFunction() error {
    // ...

    if errorOccurred {
        return nil
    }

    // ...
}</code>
ログイン後にコピー

インターフェイスの比較方法を理解することによってそうすることで、潜在的な落とし穴を回避し、より効果的な Go コードを書くことができます。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!