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

我正在使用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{}定义为参考对象这一事实有关。


暮色呼如
浏览 203回答 3
3回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go