我如何使用reflect.Value.Call() 和nil 输入?

我想在 Go 中调用一个函数,在方法值上使用reflect.Value.Call,并将 nil 作为参数传递。有关说明,请参阅下面的代码。


我曾尝试在输入数组中使用reflect.ValueOf(nil)and reflect.Value{},但第一次出现恐慌,因为 nil 没有价值;当我将它传递给 Call 时,第二个恐慌,因为它是一个零反射值。


请注意,正如代码所示,当然可以在没有反射的情况下将 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()

}


Qyouu
浏览 218回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go