假设我有一个驻留在以下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))
我怎样才能做到这一点?对此有一些通用的解决方案吗?
答案 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不是函数或者参数的数量或类型错误,这将会引起恐慌。如果你不想那样,你需要自己重新检查所有这些条件。