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