[英]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.