Golang实践录:反射reflect的一些研究及代码汇总
本文汇总一些工程中使用到的和 reflect 有关的代码示例。由于是代码片段,不一定保证完整。
解析json
本节介绍解析json的一些方法。json 可来自文件,也可来自字符串,无论哪种,都是先转换成[]byte
,再调用json.Unmarshal
解析。
有时候并不关注完整的 json 格式,我们可以只取其中一部分字段,因此,可使用map[string]interface{}
来接收解析结果(注意如是数组,则须使用数组形式)。
从json文件解析其字段
file, err := os.Open(filename)if err != nil {fmt.Printf("open file %s error: %s\n", filename, err)return}defer file.Close()read := io.Reader(file)data, _ := ioutil.ReadAll(read)var v []map[string]interface{}err = json.Unmarshal(data, &v)if err != nil {fmt.Printf("Unmarshal error: %s\n", err)return}// 假定filename里面有很多的json数组,一一遍历for _, idx := range v {fmt.Println(idx["foo"])...}
从json字符串解析
一个简单的示例,从字符串组装,到解析,到提取其中某个字段。
func TestJsonSimple(t *testing.T) {
// 原始json字符串不能格式化,必须转换成[]byte
orgJsonString :=
`{"enID":"ID250","exID":"ID251","type":1,"money":250.44,"distance":274050}`// 虽然不知道具体结构体,但知道json只有一个,不是数组var data map[string]interface{}// 解析err := json.Unmarshal([]byte(orgJsonString), &data)if err != nil {fmt.Println(err.Error())return}fmt.Printf("%#v\n", data);fmt.Println(data["money"]) // 并不关心其它字段,只抽取所需的fmt.Println(data["money1"]) // 不存在,返回nil
}
输出:
map[string]interface {}{"distance":274050, "enID":"ID250", "exID":"ID251", "money":250.44, "type":1}
250.44
<nil>
json中嵌套数组,并获取数组内容:
func showInterface(origin interface{}) {switch reflect.TypeOf(origin).Kind() {case reflect.Slice, reflect.Array:s := reflect.ValueOf(origin)for i := 0; i < s.Len(); i++ {fmt.Printf("%d: %v\n", i, s.Index(i))}case reflect.String:s := reflect.ValueOf(origin)fmt.Printf("only string %v\n", s.String())case reflect.Int:s := reflect.ValueOf(origin)fmt.Printf("only int %v\n", s.Int())}
}func TestJsonArray(t *testing.T) {orgJsonString :=
`{"enID":"ID500","exID":"ID501","type":2,"money":27.00,"distance":28322,"splitInfo":[{"index":1,"pTag":"11","pMoney":700},{"index":2,"pTag":"12","pMoney":2000}]}`// 解析var data map[string]interface{}err := json.Unmarshal([]byte(orgJsonString), &data)if err != nil {fmt.Println(err.Error())return}fmt.Printf("org json:\n%#v\n\n", data);showInterface(data["enID"])showInterface(data["splitInfo"])
}
data["splitInfo"]
是一个interface
,此刻并不知道具体的内容,因此无法再获取内部的字段或长度。可以利用reflect.TypeOf
获取类型,如是数组,需要遍历。详见代码。
输出:
org json:
map[string]interface {}{"distance":28322, "enID":"ID500", "exID":"ID501", "money":27, "splitInfo":[]interface {}{map[string]interface {}{"index":1, "pMoney":700, "pTag":"11"}, map[string]interface {}{"index":2, "pMoney":2000, "pTag":"12"}}, "type":2}only string ID500
0: map[index:1 pMoney:700 pTag:11]
1: map[index:2 pMoney:2000 pTag:12]
接上,如果只需要获取data["splitInfo"]
的长度。注意,此处是知道该字段是数组,但不知道其内容(或不关注内容),可直接用reflect.ValueOf
求出长度,如下:
mylen := reflect.ValueOf(data["splitInfo"]).Len()fmt.Println("splitInfo len: ", mylen)
Golang实践录:反射reflect的一些研究及代码汇总相关推荐
- Golang实践录:命令行cobra库实例再三优化
本文是上一文章<Golang实践录:命令行cobra库实例优化> 的优化,主要的子命令的业务实现的整理. 起因 上一版本实现的方式,还是有点不满意,格式也不对齐,重要的是,似乎不是正规的方 ...
- Golang实践录:命令行cobra库实例优化
本文上一文章<Golang实践录:命令行cobra库实例> 的优化,主要的子命令的业务实现的整理. 起因 旧版本中,每个子命令的入口函数,均需一一判断传入参数,并调用对应的业务实现函数,编 ...
- Golang实践录:利用反射reflect构建通用打印结构体接口
本文针对 Golang 的结构体字段的打印进行一些研究.其中涉及到一些反射的知识. 问题提出 总结一些实践情况,结构体字段值的输出还是比较常见的,至少笔者目前常用.比如输出某些数据表的数据(代码中会转 ...
- go 获得 mysql 实际运行 SQL,Golang实践录:一个数据库迁移的代码记录
实现一个数据库迁移的案子.有些知识点值得记录. 技术框架 github.com/go-xorm/xorm:数据库操作 github.com/denisenkom/go-mssqldb:sqlserve ...
- Golang实践录:一个数据库迁移的代码记录
实现一个数据库迁移的案子.有些知识点值得记录. 技术框架 github.com/go-xorm/xorm:数据库操作 github.com/denisenkom/go-mssqldb:sqlserve ...
- Golang实践录:静态资源文件整合:web服务
趁着五一放假,趁着有时间,把欠的一些技术集中研究研究,写写文章,好给自己一个交待. 本文研究静态资源文件的在 web 服务器的整合. 基础 Golang 中的 web 服务框架有很多种,本文选取 gi ...
- Golang实践录:静态资源文件整合:初步使用
趁着五一放假,趁着有时间,把欠的一些技术集中研究研究,写写文章,好给自己一个交待. 本文介绍如何在 Golang 中整合静态资源文件,将静态资源文件编译到二进制可执行文件中,这与其它程序的打包可能是一 ...
- Golang实践录:调用C++函数
趁着五一放假,趁着有时间,把欠的一些技术集中研究研究,写写文章,好给自己一个交待. 本文介绍如何在 Golang 中调用 C++ 函数. 起因 因工作需求,需要将一个工具由终端行的运行方式迁移到 we ...
- Golang实践录:我的工具包
程序员难免会自造轮子,因为有时候自己的轮子才更适合自己,golang 的生态圈不错,官方的,非官方都有很多不同功能的库.本文从小处着眼,基于 github 开源工程创建属于自己的工具包. 简单介绍 本 ...
最新文章
- 2022-2028年中国TPE手套行业市场全景调查及发展策略分析报告
- 使用分层实现业务处理(二)
- 五、开始Github和码云之旅,新手如何上路
- python twisted教程 二:缓慢的诗
- 安卓应用安全指南 5.2.2 权限和保护级别 规则书
- Windows下配置Apache服务器
- PDMS二次开发应用案例——PipelineTool
- 判断日期yyyymmdd
- 问诊把脉“实景三维业务发展瓶颈在哪里”和“御医良方”
- 长方形图片填充为正方形
- 一台液晶显示器台式计算机总耗电量,一天一台电脑用多少电
- 文件系统FastDFS和阿里云OSS
- 收官之战,年终的财务分析如何做?
- 计算机十年歌曲,抖音还有多少个十年能勇敢做热血青年是什么歌
- 如何在windows 10或11下制作外接便携式可移植启动盘(以安装最新的ubuntu 22.04为例)
- 蓝桥杯 灭鼠先锋 博弈
- 案例分析——2020春HIT网络与社会导论
- win10打开语言服务器,在 Windows 10 中,部署一个 Go 1.13 语言的本地文档浏览 web 服务器的流程(已缺少 godoc.exe)...
- 赛普拉斯CYpress,初接触之一电磁感应触摸按键demo
- Cognos问题解决
热门文章
- c++全局变量怎么定义_C errno全局变量是否是线程安全的
- 微信加入新功能,60秒语音不必从头听到尾,网友:还需要进度条
- 宁德时代拟再投240亿元扩产宜宾基地
- 不是明年年初?苹果明年三季度才会推出AirPods Pro 2
- 苹果正在研发iPhone检测抑郁症功能
- 8月份比亚迪纯电动汽车产销量双双超过3万辆 是去年同期3倍多
- 一年3000家企业涌入,站上风口的男色经济难逃烧钱亏损
- 华为P50系列开始量产:Pro+版或进一步延期
- Lyft出售自动驾驶部门给丰田子公司:作价5.5亿美元
- 月球好忙 蓝色起源2024年要将首位女性送上月球表面