透過反射將 Nil 值作為介面傳遞
反射介面提出了有效傳遞 nil 值的挑戰。考慮以下函數:
func f(e error) { if e == nil { fmt.Println("YEY! NIL") // Aim for this } else { fmt.Println("NOT NIL :(") } }
如果您嘗試使用以下程式碼透過反射將 nil 值傳遞給函數,將會導致恐慌:
nilArg := reflect.Zero(reflect.TypeOf((error)(nil)))
Don'不要絕望!若要繞過該問題,請使用表達式reflect.TypeOf((*error)(nil)).Elem()來取得介面錯誤的reflect.Type。此技巧涉及將非介面值傳遞給reflect.TypeOf() 並使用reflect.Elem() 派生所需的類型。
對於 nilArg 構造,請使用以下內容:
nilArg := reflect.Zero(reflect.TypeOf((*error)(nil)).Elem())
享受一個工作遊樂場範例來鞏固您的理解。
以上是如何使用 Go 反射安全地傳遞 Nil 介面值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!