[英]function type parameter match in golang
package main
type gens func(args...interface{}) int
func sum1(a int,b int,c int) int {
return a+b+c
}
func sum2(a...interface{}) int {
ret := 0
for _,v := range a {
ret = ret + v.(int)
}
return ret
}
func main() {
var a gens
//a = sum1
a = sum2
println(a(1,2,3))
}
考虑上面的代码,sum2可以工作,而sum1不能。
编译器说:“不能在分配中将sum1(func(int,int,int)int类型)用作类型gens”
我之所以问,是因为我想编写一个支持可变参数函数的goroutine调度程序,我该怎么做,但是将许多其他func参数重写为“ args ... interface {}”
谢谢!
type gens func(args...interface{}) int
您可以创建gens类型,该类型是具有接口格式参数的函数。
sum1不接受接口作为输入,因此会给您错误
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))
}
我这样改变代码。 更好的方式来展示我的思想和学习方式,请问我的游泳池英语T_T
在sum2 func中,参数实际上接受接口的一部分,您可以传递任何类型的字符串,int等,如上所示,我传递1,'2',3,现在可以了。
但是在“功能类型”中,不能确切地定义类型。 我无法运行= sum1编译器,说“不能在分配中将sum1(类型func(... int)int)用作类型gens”
在golang数据结构中,interface {}的定义与其他定义不同,我认为定义类型将更加严格! 我在http://golang.org/doc/faq#How_do_I_get_dynamic_dispatch_of_methods上找到了答案
您的函数sum1
和sum2
具有不同的签名,因此sum1无法分配给gens
类型
尽可能避免使用interface{}
数据类型,因为在使用它时需要进行运行时类型转换。 (当然,仍然有正当的理由,例如取消封送等)
您可以在此处阅读有关空接口的更多信息: http : //jordanorelli.com/post/32665860244/how-to-use-interfaces-in-go
您可以在sum2中实现类型切换以处理不同的原始类型,然后添加它们:
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)
}
至于您的用例,建议使用最后一种方法。 给每个任务一个类似“ run()”的行为,然后调度程序就知道如何处理它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.