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