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>
令人驚訝的是,這段程式碼會產生“ Error is not nil”,儘管我們的目的是測試nil 條件。
理解這種行為的關鍵在於 Go 如何實作介面。在內部,介面值由類型和值組成。雖然值可能為零,但類型永遠不會為零。在給定的範例中,(*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中文網其他相關文章!