我该如何使用反射.输入为零的Value.Call()



我想使用反射调用Go中的一个函数。值。调用方法值,并将nil作为参数传递。有关图示,请参阅下面的代码。

我曾尝试在输入数组中使用reflect.ValueOf(nil)reflect.Value{},但第一个数组因nil没有值而死机;当我把它传给Call时,第二个感到恐慌,因为它是一个Zero反射。价值

请注意,正如代码所示,在没有反射的情况下向函数传递nil当然是可能的,包括当该参数是接收器时问题是:是否可以使用反射调用函数。Value。调用,将其中一个参数作为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:的零指针

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

此外,您还可以使用reflect.Zero,它为类型提供"零值"。因此,在本文中nil是指向Thing的指针的零值。

因此,这样做将起作用:

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

相关内容

  • 没有找到相关文章

最新更新