首頁 >後端開發 >Golang >如何在 Go 中使用反射傳遞 Nil 介面值?

如何在 Go 中使用反射傳遞 Nil 介面值?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-30 14:10:14357瀏覽

How Can I Pass a Nil Interface Value Using Reflection in Go?

Go 中透過反射將 Nil 值作為介面傳遞

在 Go 中,您可以使用介面參數定義函數。雖然傳遞非 nil 介面值很簡單,但問題來了:如何透過反射傳遞 nil 值,以便它通過 == nil 檢查?

考慮以下函數:

func f(e error) {
    if e == nil {
        fmt.Println("YEY! NIL") // how to get here?
    } else {
        fmt.Println("NOT NIL :(")
    }
}

方法1:使用reflect.Zero

func main() {
    rf := reflect.ValueOf(f)

    nilArg := reflect.Zero(reflect.TypeOf((error)(nil))) // panic: reflect: Zero(nil)
}

此方法失敗,因為Reflect.Zero(reflect.TypeOf((error )(nil))) 會出現恐慌,因為您無法建立nil 類型的零值。

方法2:使用Typeof(&type)

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。

解:使用TypeOf((*error)(nil)).Elem()

正確傳遞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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn