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