• 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>
    
  • 相关阅读:
    在jupyter notebook 添加 conda 环境的操作详解
    MySQL plugin 'caching_sha2_password' cannot be loaded
    mathtype公式转latex代码
    博客园如何插入latex公式
    pip使用国内源安装
    python读取XML格式文件并转为json格式
    7.用生成函数求解下列递归方程 f(n)=2f(n/2)+cn n>1 f(1)=0 n=1
    用生成函数求解下列递归方程 f(n)=2f(n-1)+1 n>1 f(1)=2 n=1
    《将博客搬至CSDN》
    111111111111111111
  • 原文地址:https://www.cnblogs.com/zhongweikang/p/12613436.html
Copyright © 2020-2023  润新知