golang中 []interface{}转[]uint64解决办法

一、问题

在处理消息接收的时候,前段会传一个json,字段类型不定,其中一个里面userId字段是数组,所以后端在 map[string]interface{} 再解析后类型为[]interface{} 想直接转[]uint64 结果报错

在这里插入图片描述

二、解决问题

其他类似在转成接口的时候是非常好转的,但是由接口转其他类型还是有点问题的。在上面的问题中 数组里的每一项都是是接口类型 然后转成[]unit64 。就是要将里面的每一项都转成unit64。这里可以使用循环处理。

	for _,userId := range userIds.([]uint64) {
		print(userId)
	}

其实这样做有问题 如果是下面的数据

	var x []interface{}
	x[1] = "121"
	x[2] = 121
	for _, userId := range x.([]uint64) {
		print(userId)
	}

肯定会报错的。因为x里的每一项都是interface所以range的后面如果要加类型 也只能

	for _,userId := range userIds.([]interface{}) {
		print(userId)
	}

然后在循环里面处理每一项为uint64即可。在处理的时候可以实用反射,将原来里的每一项interface处理成string,然后处理int,再处理成uint64 。至于为啥不直接将interface处理成uint64 。
直接转的话interface可能会是其他的类型 比如float 然后直接转uint64就失败。如下例子
在这里插入图片描述
有些类型之间是不可以直接转换的,需要使用断言。简单的方法 fmt.Sprint()等方法可以直接转成string,然后转成int就可以了。

userIdsStr := m.Converts(nil, reflect.ValueOf(userIds))
	for _, userIdStr := range userIdsStr {
		userId, _ := strconv.ParseInt(userIdStr, 10, 64)
		list = append(list, uint64(userId))
	}

Converts 方法就是将不同类型转换成string的数组,后续可根据下需要自行处理。

// @Title Converts
// @Description 遍历变量里所有数值到一个字符串数组
// @Param   dst  []string  原始数组
// @return   v reflect.Value  变量的reflect.ValueOf() 值
// @return   []string   字符串数组

func (b *BaseServer) Converts(dst []string, v reflect.Value) []string {
	// Drill down to the concrete value
	for v.Kind() == reflect.Interface {
		v = v.Elem()
	}

	if v.Kind() == reflect.Slice {
		// Convert each element of the slice.
		for i := 0; i < v.Len(); i++ {
			dst = b.Converts(dst, v.Index(i))
		}
	} else {
		// Convert value to string and append to result
		dst = append(dst, fmt.Sprint(v.Interface()))
	}
	return dst
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值