调用函数,无论其参数类型如何

时间:2015-08-12 12:20:31

标签: function go

假设我有一个驻留在以下fn结构的Method属性中的函数:

type Method struct {
  fn interface{}
}

var inst = &Method{func(a, b int) int {
  return a + b
}}

现在,我想用两个参数调用这个函数 没有明确地将其强制转换为func(int, int) int之类的 所以

a := 5
b := 6
fmt.Println(inst.fn(a, b))

我怎样才能做到这一点?对此有一些通用的解决方案吗?

1 个答案:

答案 0 :(得分:3)

我知道的唯一方法是使用reflect.Value.Call

type Method struct {
    fn interface{}
}

func (m Method) Call(args ...interface{}) {
    vs := make([]reflect.Value, len(args))
    for i := range args {
        vs[i] = reflect.ValueOf(args[i])
    }
    v := reflect.ValueOf(m.fn)
    v.Call(vs)
}

func main() {
    f := func(a, b int) {
        fmt.Println(a + b)
    }
    m := Method{f}
    m.Call(2, 3)
}

游乐场:http://play.golang.org/p/JNtj2EMpu7

注意:如果fn不是函数或者参数的数量或类型错误,这将会引起恐慌。如果你不想那样,你需要自己重新检查所有这些条件。