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) // Displays "Error is not nil" }</code>
驚くべきことに、このコードの結果は " nil 条件をテストするつもりにもかかわらず、エラーは nil ではありません。
この動作を理解する鍵は、Go がインターフェイスを実装する方法にあります。内部的には、インターフェイス値は型と値で構成されます。値が nil であっても、型が nil になることはありません。指定された例では、(*Goof)(nil) は型「*Goof」と nil 値を持つインターフェイス値です。
ただし、エラー インターフェイスの型は "*Goof" 型とは異なります。したがって、(*Goof)(nil) と error(nil) は、両方とも nil 値を含んでいるとしても、等しくありません。これは次のコードから明らかです。
<code class="go">var g *Goof // nil var e error = g if e == nil { fmt.Println("Error is nil") } else { fmt.Println("Error is not nil") } // Output: Error is not nil</code>
この問題を解決するには、複数のアプローチがあります。
以上がGo で「nil」インターフェイス値が「error(nil)」と等しくないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。