相关疑难解决方法(0)

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

我正在研究用Go编写的模板系统,这意味着它需要自由使用reflect包.在这种特定情况下,我需要能够动态调用方法interface{}.奇怪的是,只要我的数据是已知类型,我的反射逻辑就可以正常工作,但如果数据属于类型则不行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 { …
Run Code Online (Sandbox Code Playgroud)

reflection go go-reflect

14
推荐指数
2
解决办法
1万
查看次数

标签 统计

go ×1

go-reflect ×1

reflection ×1