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”
我问的原因是因为我想写一个gortoutine调度程序来实现变量参数函数,我怎样才能重写大量其他函数参数到“args ... interface {}”
THX!
答案 0 :(得分:1)
type gens func(args...interface{}) int
你创建了类型gens,它是一个以接口格式包含参数的函数。
sum1不接受接口作为输入,因此它会给你错误
答案 1 :(得分:0)
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函数中,参数实际接受切片接口, 你可以传递任何类型的字符串,int等,见上文,我传1,' 2' 3,现在好了。
但在"功能类型"哪个确切而且明确地定义了一个类型不能。 我不能运行a = sum1 编译说"不能将sum1(类型为func(... int)int)用作赋值中的类型gens"
在golang数据结构中,接口{}定义与其他不同,我认为定义一个类型会检查更严格! 我在http://golang.org/doc/faq#How_do_I_get_dynamic_dispatch_of_methods 找到了答案答案 2 :(得分:0)
您的功能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()”之类的行为,然后调度程序知道如何处理它。