我正在使用Go编写的模板系统,这意味着它需要自由使用该reflect软件包。在这种特定情况下,我需要能够在上动态调用方法interface{}。奇怪的是,只要我的数据是已知类型,我的反射逻辑就可以正常工作,但如果数据是type则不能interface{}。在下面的例子中可以看到,在逻辑main()和Pass()是相同的。唯一的区别是数据是内部的已知类型还是已知类型interface{}播放:http://play.golang.org/p/FTP3wgc0sZpackage mainimport ( "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() failstartfinish这意味着我的动态调用方法的方法可以正常工作,除非在我的对象当前位于的情况下interface{}。相反,如果我不使用指针接收器并通过,i那么它将按预期工作。播放:http://play.golang.org/p/myM0UXVYzX这使我相信我的问题是,&i当i()为时,我无法访问其地址interface{}。我已经仔细检查了反射包并测试了诸如reflect.Value.Addr()和这样的东西,reflect.PtrTo()但是我都无法按照我需要的方式工作。我的直觉是,这与interface{}定义为参考对象这一事实有关。
3 回答
- 3 回答
- 0 关注
- 202 浏览
添加回答
举报
0/150
提交
取消