zoukankan      html  css  js  c++  java
  • 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])
        }
    }
  • 相关阅读:
    前端基础 — BOM和DOM
    JavaScript概述
    前端知识 — HTML内容、CSS基础
    数据库MySQL
    jquery ajax() 方法使用
    移动端自适应的问题及解决
    jquery appendTo 和 append 的用法
    css 截取文字
    电脑模拟手机工具
    jquery 旋转插件jqueryrotate
  • 原文地址:https://www.cnblogs.com/fwdqxl/p/7498291.html
Copyright © 2011-2022 走看看