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

      str1:=`{
"generic_id": ,
"platform": ,
"priority": ,
"region": ,
"type": ,
"type_id": ,
"type_key": "testnow"
} ` //获取多个value的方法
func GetValues(i interface{}, keys *[]string, values *map[string][]interface{}) (err error) {
if i == nil {
logger.Warn("[GetValues] 接口value存在nil值")
return
}
typeName, v := reflect.TypeOf(i), reflect.ValueOf(i)
if typeName.Kind() == reflect.Map {
vKeys := v.MapKeys()
for _, vKey := range vKeys {
val := v.MapIndex(vKey)
valKind := reflect.TypeOf(val.Interface()).Kind()
for _, key := range *keys {
if vKey.String() == key {
(*values)[key] = append((*values)[key], val.Interface())
}
}
if valKind == reflect.Map || valKind == reflect.Slice {
err = GetValues(val.Interface(), keys, values)
if err != nil {
return
}
}
}
} else if typeName.Kind() == reflect.Slice {
for j := ; j < v.Len(); j++ {
err = GetValues(v.Index(j).Interface(), keys, values)
if err != nil {
return
}
}
}
return
}
测试例子
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])
}
}

golang---interface结合reflect的泛型应用的更多相关文章

  1. 重学Golang系列(一): 深入理解 interface和reflect

    前言 interface(即接口),是Go语言中一个重要的概念和知识点,而功能强大的reflect正是基于interface.本文即是对Go语言中的interface和reflect基础概念和用法的一 ...

  2. Golang的反射reflect深入理解和示例

    编程语言中反射的概念 在计算机科学领域,反射是指一类应用,它们能够自描述和自控制.也就是说,这类应用通过采用某种机制来实现对自己行为的描述(self-representation)和监测(examin ...

  3. Golang Interface 解析

    转自 https://zhuanlan.zhihu.com/p/27652856 先看一段代码: 123456789101112 func (x interface{}) { if x == nil ...

  4. GO开发[六]:golang反射(reflect)

    反射 反射:可以在运行时动态获取变量的相关信息 ​ Import ("reflect") reflect.TypeOf,获取变量的类型,返回reflect.Type类型 refle ...

  5. golang:interface{}类型测试

    在golang中空的interface即interface{}可以看作任意类型, 即C中的void *. 对interface{}进行类型测试有2种语法: 1. Comma-ok断言: value, ...

  6. golang中的reflect包用法

    最近在写一个自动生成api文档的功能,用到了reflect包来给结构体赋值,给空数组新增一个元素,这样只要定义一个input结构体和一个output的结构体,并填写一些相关tag信息,就能使用程序来生 ...

  7. golang interface判断为空nil

    要判断interface 空的问题,首先看下其底层实现. interface 底层结构 根据 interface 是否包含有 method,底层实现上用两种 struct 来表示:iface 和 ef ...

  8. Go语言学习笔记(四)结构体struct & 接口Interface & 反射reflect

    加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 结构体struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套: go中的struc ...

  9. 工作随笔——Golang interface 转换成其他类型

    新的公司,新的氛围.一年了,打算写点什么.so,那就写google的golang语言吧. 最最最基础的语法结构见go语言菜鸟教程 接下来写点菜鸟教程没有的. go语言的设计者认为:go语言必须让程序员 ...

  10. golang interface

    接口定义 Interface类型可以定义一组方法,但是这些不需要实现.并且interface不能 包含任何变量. type Interface interface { test1(a, b int) ...

随机推荐

  1. 20155323 2016-2017-2 《Java程序设计》第6周学习总结

    20155323 2016-2017-2 <Java程序设计>第6周学习总结 教材学习内容总结 串流:衔接数据的来源和目的地就是串流对象. I/O操作主要是指使用Java进行输入,输出操作 ...

  2. [Java]ArrayList集合的contains方法

    用到集合ArrayList时经常会用到里面自带的方法boolean contains(Object o);此方法用于判断集合里面是否包含元素o,现在讨论下在Object类型为类类型的时候的情况: cl ...

  3. java web 项目启动的根目录,以及项目启动后使用的端口具体是哪一个

    1.今天启动项目发现一直找不到网页,原来是自己浏览器地址的根目录出现了问题,那么系统中的根目录(也就是项目名)到底是哪个,究竟以哪个为基准? 这里有一地方不能忽视:见图片 在普通的java web项目 ...

  4. 论文笔记(3)-Extracting and Composing Robust Features with Denoising Autoencoders

    这篇文章是Bengio研究的在传统的autoencoder基础上增加了噪声参数,也就是说在输入X的时候,并不直接用X的数据,而是按照一定的概率来清空输入为0.paper中的名词为corrupted.这 ...

  5. Elasticsearch 在 windows 和 ubuntu 下详细安装过程

    1. 前言 作为一名 .NET 平台开发者,选择开发框架时总会面临更多的局限性,不过对于搜索这种刚需服务来说,开源框架可供选择的余地还是比较大的.笔者之前用的是 Lucene.net ,现在深感其使用 ...

  6. Sharepoint 安装部署Project Server

    #在SharePoint Central Administration-> Manage service applications中,点击New button,选择Project Service ...

  7. DBCC--EXTENTINFO/IND/PAGE--显示数据页信息

    DBCC EXTENTINFO得到对象分配的区DBCC EXTENTINFO(<dbname|dbid>,<tabelname|tableid>[,{indexname|ind ...

  8. [翻译]NUnit---TearDown and SetUpFixture and Test Attributes(二十)

    TearDownAttribute (NUnit 2.0 / 2.5) 本特性在TestFixture内部使用,每个测试方法执行后调用的方法集.也可以在SetUpFixture中使用,在同一命名空间或 ...

  9. onsrcoll和scrollTop兼容与实现

    对于onscroll事件的支持 各浏览器 document.document.body.document.documentElement 对象的 onscroll 事件的支持存在差异. 所谓的支持性存 ...

  10. Sentinel 哨兵 实现redis高可用

    本文链接:http://www.cnblogs.com/zhenghongxin/p/8885879.html 我们知道redis是有主从复制的,例如下图: 但如果master主进程挂掉之后,没有sl ...