在 Go 中,您可以使用介面參數定義函數。雖然傳遞非 nil 介面值很簡單,但問題來了:如何透過反射傳遞 nil 值,以便它通過 == nil 檢查?
考慮以下函數:
func f(e error) { if e == nil { fmt.Println("YEY! NIL") // how to get here? } else { fmt.Println("NOT NIL :(") } }
func main() { rf := reflect.ValueOf(f) nilArg := reflect.Zero(reflect.TypeOf((error)(nil))) // panic: reflect: Zero(nil) }
此方法失敗,因為Reflect.Zero(reflect.TypeOf((error )(nil))) 會出現恐慌,因為您無法建立nil 類型的零值。
type MyError struct{} func (e MyError) Error() string { return "" } func main() { rf := reflect.ValueOf(f) nilArg := reflect.Zero(reflect.TypeOf(&MyError{})) // NOT NIL :( }
由於Go FAQ 中有關nil 錯誤的條目,該方法也會失敗,該條目指出介面類型可以為nil 或指向特定類型。專門傳遞 nil 是不正常的。如果你嘗試在 nil 介面上呼叫方法,它會panic。
正確傳遞nil value 透過反射,使用表達式reflect.TypeOf((*error)(nil )).Elem()取得錯誤介面的reflect.Type。此表達式建立一個非介面值,並使用反射方法來取得所需的reflect.Type。
建立nilArg如下:
nilArg := reflect.Zero(reflect.TypeOf((*error)(nil)).Elem())
使用此方法,使用nilArg調用f將列印「YEY!NIL。」
請參閱有效遊樂場範例以了解有效遊樂場範例以了解有效遊樂場範例以了解有效遊樂場範例以了解有效遊樂場範例以了解有效遊樂場範例以了解有效遊樂場範例以了解有效遊樂場範例以了解有效遊樂場範例以了解有效遊樂場範例以了解有效遊樂場範例以了解有效遊樂場範例以了解有效遊樂場範例以了解有效遊樂場範例以了解有效遊樂場範例以了解有效遊樂場範例以了解有效遊樂場範例以了解有效遊樂場範例以了解有效遊樂場範例以了解有效遊樂場範例以了解有效遊樂場範例以了解有效遊樂場範例以了解有效遊樂場範例以了解有效遊樂場範例以了解有效遊樂場範例以了解有效遊樂場範例以了解有效遊樂場範例以了解有效遊樂場範例以了解有效”的實現。
以上是如何在 Go 中使用反射傳遞 Nil 介面值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!