Function 调用函数,而不考虑其参数类型
假设我有一个函数,它位于以下Function 调用函数,而不考虑其参数类型,function,go,Function,Go,假设我有一个函数,它位于以下方法结构的fn属性中: type Method struct { fn interface{} } var inst = &Method{func(a, b int) int { return a + b }} 现在,我想用两个参数调用这个函数 而不显式将其强制转换为func(int,int)int类似 所以 我怎样才能做到这一点?是否有一些通用解决方案?我知道的唯一方法是使用: 操场: 注意:如果fn不是函数,或者参数的数量或类型错误,这将导致死
方法
结构的fn
属性中:
type Method struct {
fn interface{}
}
var inst = &Method{func(a, b int) int {
return a + b
}}
现在,我想用两个参数调用这个函数
而不显式将其强制转换为func(int,int)int
类似
所以
我怎样才能做到这一点?是否有一些通用解决方案?我知道的唯一方法是使用: 操场:
注意:如果fn不是函数,或者参数的数量或类型错误,这将导致死机。如果您不想这样做,您需要自己重新检查所有这些条件。我认为在Go中,如果不最终使用reflect软件包,这是不可能的。如果我可以使用reflectionNote解决此问题,也可以。我强烈建议您不要这样做,最后,你会得到更多的问题和头发拉扯错误为一点语法糖。您可能无法对返回参数执行任何操作。。。但是这是一个很好的发现(我写的是同一个答案:P)。@Elwinar我同意不使用这些方法,除非没有其他方法,但是你实际上可以得到返回值,因为
reflect.Value.Call
确实会返回它们。是的,但是你必须对Method.Call
的返回值进行强制转换,这最终并不实用。@Elwinar当你在围棋中使用类似的东西时,实用性就变成了一个非常松散的概念:)@GrzegorzŻur重新阅读这个问题。OP希望“不显式地将其强制转换为func(int,int)int”。
a := 5
b := 6
fmt.Println(inst.fn(a, b))
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)
}