Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function 调用函数,而不考虑其参数类型_Function_Go - Fatal编程技术网

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)
}