「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Nil エラーインスタンスが Nil と比較できないのはなぜですか?

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

2025 年 1 月 15 日に公開
ブラウズ:416

Why Does a Nil Error Instance Not Compare as Nil?

Nil エラー インスタンスが Nil として表示されない

インターフェイスの比較を理解するには、型と値の両方が評価されることを認識することが重要です。

コード スニペットを考えてみましょう:

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"
}

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

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

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

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)
}
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3