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 サイトの他の関連記事を参照してください。