【发布时间】:2014-09-06 13:11:02
【问题描述】:
我想在 Go 中调用一个函数,在方法值上使用 reflect.Value.Call,并将 nil 作为参数传递。请参阅下面的代码以获取说明。
我尝试在输入数组中使用reflect.ValueOf(nil) 和reflect.Value{},但第一次出现恐慌,因为 nil 没有价值;当我将它传递给 Call 时,第二个恐慌,因为它是零 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()
}
【问题讨论】:
标签: reflection go