我正在使用Go编写的模板系统,这意味着它需要自由使用该reflect软件包。在这种特定情况下,我需要能够在上动态调用方法interface{}。奇怪的是,只要我的数据是已知类型,我的反射逻辑就可以正常工作,但如果数据是type则不能interface{}。
在下面的例子中可以看到,在逻辑main()和Pass()是相同的。唯一的区别是数据是内部的已知类型还是已知类型interface{}
播放:http://play.golang.org/p/FTP3wgc0sZ
package main
import (
"fmt"
"reflect"
)
type Test struct {
Start string
}
func (t *Test) Finish() string {
return t.Start + "finish"
}
func Pass(i interface{}) {
_, ok := reflect.TypeOf(&i).MethodByName("Finish")
if ok {
fmt.Println(reflect.ValueOf(&i).MethodByName("Finish").Call([]reflect.Value{})[0])
} else {
fmt.Println("Pass() fail")
}
}
func main() {
i := Test{Start: "start"}
Pass(i)
_, ok := reflect.TypeOf(&i).MethodByName("Finish")
if ok {
fmt.Println(reflect.ValueOf(&i).MethodByName("Finish").Call([]reflect.Value{})[0])
} else {
fmt.Println("main() fail")
}
}
执行此代码后,我们得到以下结果
Pass() fail
startfinish
这意味着我的动态调用方法的方法可以正常工作,除非在我的对象当前位于的情况下interface{}。
相反,如果我不使用指针接收器并通过,i那么它将按预期工作。
播放:http://play.golang.org/p/myM0UXVYzX
这使我相信我的问题是,&i当i()为时,我无法访问其地址interface{}。我已经仔细检查了反射包并测试了诸如reflect.Value.Addr()和这样的东西,reflect.PtrTo()但是我都无法按照我需要的方式工作。我的直觉是,这与interface{}定义为参考对象这一事实有关。
相关分类