繁体   English   中英

Golang中的函数类型参数匹配

[英]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上找到了答案

您的函数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()”的行为,然后调度程序就知道如何处理它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM