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
golang中的函数类型参数匹配_Go_Goroutine - Fatal编程技术网

golang中的函数类型参数匹配

golang中的函数类型参数匹配,go,goroutine,Go,Goroutine,考虑上面的代码,sum2可以工作,但sum1不能 编译器说“不能将sum1(类型func(int,int,int)int)用作赋值中的类型gens” 我之所以问这个问题,是因为我想编写一个goroutine调度程序来调用变量params函数,除了将大量其他func参数重写为“args…interface{}”之外,我该怎么做呢 谢谢 您可以创建类型gens,这是一个在接口格式中具有参数的函数 sum1不接受接口作为输入,因此它会给出错误信息 type gens func(args...inter

考虑上面的代码,sum2可以工作,但sum1不能

编译器说“不能将sum1(类型func(int,int,int)int)用作赋值中的类型gens”

我之所以问这个问题,是因为我想编写一个goroutine调度程序来调用变量params函数,除了将大量其他func参数重写为“args…interface{}”之外,我该怎么做呢

谢谢

您可以创建类型gens,这是一个在接口格式中具有参数的函数

sum1不接受接口作为输入,因此它会给出错误信息

type gens func(args...interface{}) int
我像这样修改代码。只是为了更好地展示我的思考和学习,请原谅我的台球英语

在sum2 func中,参数实际上接受接口的切片, 你可以传递任何类型的字符串,int等等,看上面,我传递1,'2',3,现在就可以了

但在“函数类型”中,准确而明确地定义一个类型是不可能的。 我不能运行a=sum1 编译器说“不能在赋值中使用sum1(类型func(…int)int)作为类型gens”

在golang数据结构中,定义的接口{}不同于其他接口,我认为定义一个类型会检查得更严格!
我在上找到了答案,您的函数
sum1
sum2
具有不同的签名,因此无法将sum1分配给类型
gens

尽可能避免使用
接口{}
数据类型,因为在使用它时需要进行运行时类型转换。(当然,仍然有充分的理由这样做,如取消签名等)

您可以在此处阅读有关空界面的更多信息:

您可以在sum2中实现一个类型开关来处理不同的基元类型,然后添加它们:

package main

type gens func(args...interface{}) int

func sum1(a...int) int {
    ret := 0
    for _,v := range a {
        ret = ret + v
    }
    return ret
}

func sum2(a...interface{}) int {
    ret := 0
    for _,v := range a {
        if _,ok := v.(int);ok {
            ret = ret + v.(int)
        }
    }
    return ret
}

func main() {
    var a gens
    println(sum2(1,'2',3))
    //a = sum1
    a = sum2
    println(a(1,2,3))
}
或者您可以自己定义一个接口,然后在函数中接受它

func sum2(a...interface{}) int {
    ret := 0
    for _,v := range a {
        switch d := v.(type) {
            case int, int32, int16:
                ret += int(d)
            case float64,float32:
               ret += float(d)
        }
        if _,ok := v.(int);ok {
            ret = ret + v.(int)
        }
    }
    return ret
}

对于您的用例,建议使用最后一种方法。给每个任务一个类似“run()”的行为,然后调度程序知道如何处理它

你不能。有关解释和解决方案,请参阅。谢谢回复@首先,您可以清楚地看到,您正在代码中传递接口的一部分。您应该传递接口并获取底层类型(可以是切片)。因此,在
sum1
中,您实际上是在传递int类型参数,这些参数不能使用接口的切片进行包装。在我看来,定义一个参数为“x…interface{}”的函数,您可以传递任何类型、字符串、int等。但在“函数类型”中,它准确而明确地定义了一个您无法定义的类型。我发现接口上的答案不需要类型,但类型gens是一个func,参数作为接口给出,func返回int,sum1不工作的原因是参数作为接口传递给sum 1,但sum1希望得到3个int值
func sum2(a...interface{}) int {
    ret := 0
    for _,v := range a {
        switch d := v.(type) {
            case int, int32, int16:
                ret += int(d)
            case float64,float32:
               ret += float(d)
        }
        if _,ok := v.(int);ok {
            ret = ret + v.(int)
        }
    }
    return ret
}
type Integer interface{
    Int() int
}

func sum(i... Integer) {
    result := 0
    for _, v := range i {
        result += v.Int()
    }
} 

type myfloat float64
func (m myfloat) Int() int {
    return int(m)
}