前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >go: 反射小实例

go: 反射小实例

作者头像
超级大猪
发布2021-09-10 10:24:44
3540
发布2021-09-10 10:24:44
举报
文章被收录于专栏:大猪的笔记大猪的笔记

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

遍历一个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)
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-09-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 遍历一个slice,并且将它转换为int类型
  • 附录,转换的几个工具函数
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档