zoukankan      html  css  js  c++  java
  • go语言 array_sum 求和方法(反射+泛型)

    给定一个任意类型的切片/数组,求所有元素的值

    原型:ArraySum(input interface{}) (sum float64, err error)

    功能:对 input 切片中的所有数据求和,结果累计在 sum 中输出

    代码实现:

    package reflect
    
    import (
        "reflect"
        "errors"
        "strconv"
    )
    
    // 数组切片求和
    func ArraySum(input interface{}) (sum float64, err error) {
        list := reflect.ValueOf(input)
        switch reflect.TypeOf(input).Kind() {
        case reflect.Slice, reflect.Array:
            for i := 0; i < list.Len(); i++ {
                val := list.Index(i)
                v, err := toFloat64(val.Interface())
                if err != nil {
                    return 0, err
                }
                sum += v
            }
        default:
            return 0, errors.New("input must be slice or array")
        }
        return
    }
    
    
    func toFloat64(in interface{}) (f64 float64, err error) {
        switch val := in.(type) {
        case float64:
            return val, nil
        case float32:
            return float64(val), nil
        case uint8:
            return float64(val), nil
        case uint16:
            return float64(val), nil
        case uint32:
            return float64(val), nil
        case uint64:
            return float64(val), nil
        case uint:
            if strconv.IntSize == 32 || strconv.IntSize == 64 {
                return float64(val), nil
            }
            return 0, errors.New("convert uint to float64 failed")
        case int8:
            return float64(val), nil
        case int16:
            return float64(val), nil
        case int32:
            return float64(val), nil
        case int64:
            return float64(val), nil
        case int:
            if strconv.IntSize == 32 || strconv.IntSize == 64 {
                return float64(val), nil
            }
            return 0, errors.New("convert int to float64 failed")
        case bool:
            if val {
                f64 = 1
            }
            return
        case string:
            f64, err = strconv.ParseFloat(val, 64)
            if err == nil {
                return
            }
            return 0, errors.New("convert string to float64 failed")
        default:
            return 0, errors.New("convert to float64 failed")
        }
    }

    测试:

    func TestArraySum(t *testing.T) {
    	numberInt := []int{1,2,3,4}
    	val, err := ArraySum(numberInt)
    	fmt.Println(val, err)
    
    	numberStr := []string{"1","2","3","4"}
    	val, err = ArraySum(numberStr)
    	fmt.Println(val, err)
    }
    

    测试结果:

    10 <nil>
    10 <nil>
    
  • 相关阅读:
    人脸Pose检测:ASM、AAM、CLM总结
    AI:AI是什么?
    AI不与人为敌
    CMMI评估流程
    AI:恐怖谷理论的陷阱
    Christopher G. Atkeson 简介
    QtUI设计:设置控件透明
    QT设计UI:QT模式对话框打开文件
    SLAM:(编译ORB)fatal error LNK1181: 无法打开输入文件“libboost_mpi-vc110-mt-1_57.lib”
    error C3859: 超过了PCH的虚拟内存范围;请使用“-Zm33”或更大的命令行选项重新编译
  • 原文地址:https://www.cnblogs.com/zhongweikang/p/12613436.html
Copyright © 2011-2022 走看看