golang---interface结合reflect的泛型应用

大致思路:序列化未知json放入一个interface{}中再通过反射将其内容解析出来

 1      str1:=`{
 2             "generic_id": 882,
 3             "platform": 12,
 4             "priority": 262,
 5             "region": 31,
 6             "type": 105,
 7             "type_id": 0,
 8             "type_key": "testnow"
 9         } `
10             
11 //获取多个value的方法
12 func GetValues(i interface{}, keys *[]string, values *map[string][]interface{}) (err error) {
13     if i == nil {
14         logger.Warn("[GetValues] 接口value存在nil值")
15         return
16     }
17     typeName, v := reflect.TypeOf(i), reflect.ValueOf(i)
18     if typeName.Kind() == reflect.Map {
19         vKeys := v.MapKeys()
20         for _, vKey := range vKeys {
21             val := v.MapIndex(vKey)
22             valKind := reflect.TypeOf(val.Interface()).Kind()
23             for _, key := range *keys {
24                 if vKey.String() == key {
25                     (*values)[key] = append((*values)[key], val.Interface())
26                 }
27             }
28             if valKind == reflect.Map || valKind == reflect.Slice {
29                 err = GetValues(val.Interface(), keys, values)
30                 if err != nil {
31                     return
32                 }
33             }
34         }
35     } else if typeName.Kind() == reflect.Slice {
36         for j := 0; j < v.Len(); j++ {
37             err = GetValues(v.Index(j).Interface(), keys, values)
38             if err != nil {
39                 return
40             }
41         }
42     }
43     return
44 }
测试例子
func TestGetValues(t *testing.T) {
    keys := []string{“generic_id", "type", "region"}
    var i interface{}
    if err := json.Unmarshal([]byte(str1), &i); err != nil {
        fmt.Sprintf("json.unmarshal错误!")
    }
    r := &map[string][]interface{}{}
    err := GetValues(i, &keys, r)
    if err != nil {
        logger.Errorf("err:%s", err)
        return
    }
    for _, v := range keys {
        fmt.Println(v)
        fmt.Println((*r)[v])
    }
}

 

 

转载于:https://www.cnblogs.com/fwdqxl/p/7498291.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值