为了账号安全,请及时绑定邮箱和手机立即绑定

无论接收方类型如何,接口{}上的动态调用方法

无论接收方类型如何,接口{}上的动态调用方法

Go
暮色呼如 2021-05-04 12:12:28
我正在使用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
提交
取消
意见反馈 帮助中心 APP下载
官方微信