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).
解決方案:
要解決此問題,您可以採用以下方法之一:
更多詳情請參閱擴充回覆下方:
擴充回應:
介面值由兩個元件組成:型別和動態值。 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中文網其他相關文章!