如何实现多态变参数的求和?

发布于 2022-09-05 05:14:55 字数 716 浏览 22 评论 0

求问下面的Add2这里怎么实现?sum为interface好像没法任意求和?

func Add(vars ... int)(ret int){
    var sum int
    for _,v := range vars {
        //fmt.Println("v",v)
        sum += v
    }

    return sum
}


//这里怎么实现?sum为interface好像没法任意求和?
func Add2(vars ... interface{})(ret interface{}){
    /* var sum interface{}
    for _,v := range vars {
        switch v.(type){
            case int:
            sum += v
            case float64:
            sum += v
            case string:
            sum += v
        }
    } */

    return sum
}



func main() {
    fmt.Println(Add2(1,2))
    fmt.Println(Add2(1,2,3))
    fmt.Println(Add2(2.4, 3.6, 1.0))
    fmt.Println(Add2("Hello", "world", "zhong"))
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

叹梦 2022-09-12 05:14:57

你的应该存在一个潜在的前提,就是传入的参数是一致的类型。

下面的例子,取第一个值的类型,作为整个相加运算的类型,如果有和第一个类型不一致的数据会被忽略,用到了反射。

package main

import (
    "fmt"
    "reflect"
)

func main() {
    fmt.Println(sum(1.2, 2.0))
    fmt.Println(sum(1, 2))
    fmt.Println(sum("hello", " ", "world"))
}

func sum(vars ...interface{}) interface{} {
    var result interface{}
    if len(vars) == 0 {
        return result
    }
    inferType := reflect.TypeOf(vars[0])
    for i, v := range vars {
        if i == 0 {
            result = v
            continue
        }
        if reflect.TypeOf(v) == inferType {
            switch inferType.Name() {
            case "int":
                result = result.(int) + v.(int)
            case "float64":
                result = result.(float64) + v.(float64)
            case "string":
                result = result.(string) + v.(string)
            }
        }
    }
    return result
}

输出

3.2
3
hello world
心碎的声音 2022-09-12 05:14:57

你想要的是泛型吧?凑合写了一个,忽略与第一个参数不同类型的值。

func add(vars ... interface{})(ret interface{}) {
    var sum interface{}
    for _, v := range vars {
        sum = addTo(sum, v)
    }
    return sum
}

func addTo(sum interface{}, v interface{})(ret interface{} ){
    if (sum == nil) {
        return v
    }
    switch v.(type) {
        case int:
        if intSum, found := sum.(int); found {
            return intSum + v.(int)
        }
        case string:
        if strSum, found := sum.(string); found {
            return strSum + v.(string)
        }
    }
    return sum
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文