Nil Nil インターフェース比較パズル
エラーインターフェースを満たしているにもかかわらず、nil インスタンスを持つ構造体は動作しませんnil と比較すると予想どおりです。
質問:
次のコードが「Error is 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 not nil" }</code>
答え:
Go では、インターフェイスの比較では型と値の両方が考慮されます。 Goof 型は error インターフェースを実装しますが、Goof (*Goof)(nil) の nil インスタンスは、 error(nil).
解決策:
これに対処するには、次のいずれかのアプローチを採用できます:
詳細については、以下の拡張応答を参照してください。
拡張応答:
インターフェイス値は、タイプと a の 2 つのコンポーネントで構成されます。動的な値。 nil インターフェース値には、nil 型と nil 値の両方が含まれます。この場合、(*Goof)(nil) は非 nil 型 (Goof) ですが、値は nil です。
さらに、Go の等価演算子 (==) は型の同一性を厳密にチェックします。したがって、(*Goof)(nil) と error(nil) の比較は、型が異なるため失敗します。
この動作は、Go の他の型チェックと一致しています。たとえば、次のコードでは、基になるデータは同じ (3) ですが、変数の型が異なるため、インターフェイスに格納すると不等号が生じます:
<code class="go">var x int = 3 var y Bob = 3 var ix, iy interface{} = x, y fmt.Println(ix == iy) // false</code>
以上がエラーインターフェイスを満たす構造体の nil インスタンスが nil と等しくないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。