簡體   English   中英

如何使用帶有nil輸入的reflect.Value.Call()?

[英]How can I use reflect.Value.Call() with a nil input?

我想在Go中調用一個函數,在方法值上使用reflect.Value.Call,並將nil作為參數傳遞。 請參閱下面的代碼以獲取說明。

我嘗試在輸入數組中使用reflect.ValueOf(nil)reflect.Value{} ,但是第一次恐慌是因為nil沒有值; 當我把它傳遞給Call時,第二次恐慌,因為它是一個Zero reflect.Value。

請注意,正如代碼所示,當然可以將nil傳遞給沒有反射的函數,包括當該參數是接收器時。 問題是: 是否可以使用reflect.Value.Call調用func,將其中一個參數傳遞為nil?

您可以在http://play.golang.org/p/x9NXMDHWdM上構建並運行以下代碼

package main

import "reflect"

type Thing struct{}

var (
    thingPointer = &Thing{}
    typ          = reflect.TypeOf(thingPointer)
)

func (t *Thing) DoSomething() {
    if t == nil {
        println("t was nil")
    } else {
        println("t was not nil")
    }
}

func normalInvokation() {
    thingPointer.DoSomething()
    // prints "t was not nil"
    t := thingPointer
    t = nil
    t.DoSomething()
    // prints "t was nil"
}

func reflectCallNonNil() {
    m, _ := typ.MethodByName("DoSomething")
    f := m.Func
    f.Call([]reflect.Value{reflect.ValueOf(&Thing{})})
    // prints "t was not nil"
}

func reflectCallNil() {
    // m, _ := typ.MethodByName("DoSomething")
    // f := m.Func
    // f.Call(???)
    // how can I use f.Call to print "t was nil" ?
}

func main() {
    normalInvokation()
    reflectCallNonNil()
    reflectCallNil()
}

一種選擇是簡單地告訴reflect你的意思是指向Thing的nil指針:

func reflectCallNonNil() {
    m, _ := typ.MethodByName("DoSomething")
    f := m.Func
    f.Call([]reflect.Value{reflect.ValueOf((*Thing)(nil))})

}

此外,您可以使用reflect.Zero ,它為您提供類型的“零值”。 所以這個上下文中的零是指針Thing的零值。

因此,這樣做將起作用:

func reflectCallNil() {
    m, _ := typ.MethodByName("DoSomething")
    f := m.Func
    f.Call([]reflect.Value{reflect.Zero(reflect.TypeOf(&Thing{}))})
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM