go: 反射小实例

2021-09-10 10:24:44 浏览数 (1)

这篇文章将搜集一些平时在工作中用到的使用反射小实例。 反射反射真快乐。

遍历一个slice,并且将它转换为int类型

代码语言:javascript复制
func Slice2Ints(s interface{}) ([]int, error) {
    val := reflect.ValueOf(s)
    if val.Kind() != reflect.Slice {
        return nil, fmt.Errorf("s:%v is not slice type", s)
    }

    ret := make([]int, 0, 10)
    for i := 0; i < val.Len(); i   {
        e := val.Index(i)
        v := e.Interface()
        intV, err := ToInt(v)
        if err != nil {
            return nil, err
        }
        ret = append(ret, intV)
    }
    return ret, nil
}

附录,转换的几个工具函数

代码语言:javascript复制
// ToInt 尝试将任意类型的数据转换为int
func ToInt(intObj interface{}) (int, error) {
    // 假定int == int64,运行在64位机
    // Debugf("ToInt:%v", intObj)
    switch v := intObj.(type) {
    case json.Number:
        strVal := string(v)
        return ToInt(strVal)
    case int:
        return v, nil
    case int8:
        return int(v), nil
    case int16:
        return int(v), nil
    case int32:
        return int(v), nil
    case int64:
        return int(v), nil
    case uint:
        return int(v), nil
    case uint8:
        return int(v), nil
    case uint16:
        return int(v), nil
    case uint32:
        return int(v), nil
    case uint64:
        if v > math.MaxInt64 {
            info := fmt.Sprintf("ToInt error, overflowd %v", v)
            return 0, errors.New(info)
        }
        return int(v), nil
    case float32:
        return int(v), nil
    case float64:
        return int(v), nil
    case string:
        strv := v
        if strings.Contains(v, ".") {
            strvArr := strings.Split(v, ".")
            if len(strvArr) != 2 {
                return 0, fmt.Errorf("ToInt error, invalid format:%v", v)
            }
            strv = strvArr[0]
        }
        if strv == "" {
            return 0, fmt.Errorf("ToInt error, empty string cannot convert to int")
        }
        if intv, err := strconv.Atoi(strv); err == nil {
            return intv, nil
        }
    }
    return 0, fmt.Errorf("ToInt error, %v cannot convert to int", intObj)
}

0 人点赞