golang中的函数类型参数匹配

时间:2018-02-13 09:05:12

标签: go goroutine

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!

3 个答案:

答案 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)

您的功能sum1sum2具有不同的签名,因此无法将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()”之类的行为,然后调度程序知道如何处理它。