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。與直覺相反,程式不會列印「Error is not nil.」
這是因為介面比較不僅檢查值,還會檢查類型。在這種情況下, *Goof 的 nil 實例與錯誤介面的類型不同。因此,比較 err == nil 失敗。
要解決此問題,有多種選擇。一種是直接將err 宣告為error 類型的變數:
<code class="go">var err error = g</code>
另一種選擇是如果發生錯誤,則從函數中傳回nil:
<code class="go">func MyFunction() error { // ... if errorOccurred { return nil } // ... }</code>
透過了解介面比較的方式工作,您可以避免潛在的陷阱並編寫更有效的Go 程式碼。
以上是為什麼 Go 中將 nil 介面與 nil 進行比較會失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!