檢查Go 中的Nil 和Nil 介面
在Go 中使用介面時,通常需要檢查介面是否為nil 或包含零值。但是,使用反射的標準方法可能很冗長且容易出錯。
例如,考慮以下輔助函數:
func isNil(a interface{}) bool { defer func() { recover() }() return a == nil || reflect.ValueOf(a).IsNil() }
此函數使用反射來檢查值是否為nil ,但它需要一個延遲的recover()來處理不支援值類型時的恐慌。
更直接的方法
正如原始問題的答案所暗示的,一種更簡單、更可靠的方法是對nil 介面使用直接比較,並且始終允許將nil 指派給無類型介面。具體方法如下:
func isNil(a interface{}) bool { return a == nil }
此函數將正確檢查 nil 介面和介面內的 nil 值。
當允許 (*T)(nil) 賦值時
上面概述的方法假設您永遠不會將 (*T)(nil) 指派給介面。如果不是這種情況,您可能需要使用反射來檢查nil 值:
func isNil(a interface{}) bool { if a == nil { return true } v := reflect.ValueOf(a) if v.Kind() == reflect.Ptr && v.IsNil() { return true } return false }
但是,通常建議避免將(*T)(nil) 分配給接口,因為它可能會導致到微妙的錯誤。透過在介面中強制執行絕不儲存 (*T)(nil) 的規則,您可以簡化程式碼並提高其可靠性。
以上是如何可靠地檢查 Go 中的 Nil 介面和 Nil 值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!