Go 每日一库之 mapstructure
简介
mapstructure
用于将通用的map[string]interface{}
解码到对应的 Go 结构体中,或者执行相反的操作。很多时候,解析来自多种源头的数据流时,我们一般事先并不知道他们对应的具体类型。只有读取到一些字段之后才能做出判断。这时,我们可以先使用标准的encoding/json
库将数据解码为map[string]interface{}
类型,然后根据标识字段利用mapstructure
库转为相应的 Go 结构体以便使用。
快速使用
本文代码采用 Go Modules。
首先创建目录并初始化:
$ mkdir mapstructure && cd mapstructure$ go mod init github.com/darjun/go-daily-lib/mapstructure
下载mapstructure
库:
$ go get github.com/mitchellh/mapstructure
使用:
package mainimport ("encoding/json""fmt""log""github.com/mitchellh/mapstructure"
)type Person struct {Name stringAge intJob string
}type Cat struct {Name stringAge intBreed string
}func main() {datas := []string{`{ "type": "person","name":"dj","age":18,"job": "programmer"}`,`{"type": "cat","name": "kitty","age": 1,"breed": "Ragdoll"}`,}for _, data := range datas {var m map[string]interface{}err := json.Unmarshal([]byte(data), &m)if err != nil {log.Fatal(err)}switch m["type"].(string) {case "person":var p Personmapstructure.Decode(m, &p)fmt.Println("person", p)case "cat":var cat Catmapstructure.Decode(m, &cat)fmt.Println("cat", cat)}}
}
运行结果:
$ go run main.go
person {dj 18 programmer}
cat {kitty 1 Ragdoll}
我们定义了两个结构体Person
和Cat
,他们的字段有些许不同。现在,我们约定通信的 JSON 串中有一个type
字段。当type
的值为person
时,该 JSON 串表示的是Person
类型的数据。当type
的值为cat
时,该 JSON 串表示的是Cat
类型的数据。
上面代码中,我们先用json.Unmarshal
将字节流解码为map[string]interface{}
类型。然后读取里面的type
字段。根据type
字段的值,再使用mapstructure.Decode
将该 JSON 串分别解码为Person
和Cat
类型的值,并输出。
实际上,Google Protobuf 通常也使用这种方式。在协议中添加消息 ID 或全限定消息名。接收方收到数据后,先读取协议 ID 或全限定消息名。然后调用 Protobuf 的解码方法将其解码为对应的Message
结构。从这个角度来看,mapstructure
也可以用于网络消息解码,如果你不考虑性能的话
Go 每日一库之 mapstructure相关推荐
- golang常用库之mapstructure包 | 多json格式情况解析、GO json 如何转化为 map 和 struct、Go语言结构体标签(Struct Tag)
文章目录 golang常用库之mitchellh/mapstructure包 | go将map转换为struct 一.msgpack 二.背景 三.多json格式情况解析使用思路 四.mapstruc ...
- go get 失败 no go files in_Go 每日一库之 dig
简介 今天我们来介绍 Go 语言的一个依赖注入(DI)库--dig.dig 是 uber 开源的库.Java 依赖注入的库有很多,相信即使不是做 Java 开发的童鞋也听过大名鼎鼎的 Spring.相 ...
- go float64 比较_Go 每日一库之 plot
Go 每日一库之 plot 简介 本文介绍 Go 语言的一个非常强大.好用的绘图库--plot.plot内置了很多常用的组件,基本满足日常需求.同时,它也提供了定制化的接口,可以实现我们的个性化需求. ...
- go get 的不再src目录中_Go 每日一库之 sqlc:根据 sql 生成代码
简介 在 Go 语言中编写数据库操作代码真的非常痛苦!database/sql标准库提供的都是比较底层的接口.我们需要编写大量重复的代码.大量的模板代码不仅写起来烦,而且还容易出错.有时候字段类型修改 ...
- go 默认http版本_【每日一库】超赞的 Go 语言 INI 文件操作
点击上方蓝色"Go语言中文网"关注我们,领全套Go资料,每天学习 Go 语言 如果你使用 INI 作为系统的配置文件,那么一定会使用这个库吧.没错,它就是号称地表 最强大.最方便 ...
- go get如何删除_Go 每日一库之 xorm
简介 Go 标准库提供的数据库接口database/sql比较底层,使用它来操作数据库非常繁琐,而且容易出错.因而社区开源了不少第三方库,如上一篇文章中的sqlc工具,还有各式各样的 ORM (Obj ...
- go 根据输入类型执行对应的方法_Go 每日一库之 sqlc
简介 在 Go 语言中编写数据库操作代码真的非常痛苦!database/sql标准库提供的都是比较底层的接口.我们需要编写大量重复的代码.大量的模板代码不仅写起来烦,而且还容易出错.有时候字段类型修改 ...
- Go 每日一库之 zap
转载地址:Go 每日一库之 zap - SegmentFault 思否 简介 在很早之前的文章中,我们介绍过 Go 标准日志库log和结构化的日志库logrus.在热点函数中记录日志对日志库的执行性能 ...
- 每日一库之Go 强大而灵活的电子邮件库:email
发送邮件是一个很常见的需求:用户邮箱验证.邮箱召回等.Go 语言标准库自带 net/smtp 库,实现了 smtp 协议,用于发送邮件.然而这个库比较原始,使用不方便,而且官方声明不再增加新功能.于是 ...
最新文章
- 公司--As Imp的写法
- 非线性调频 matlab,非线性调频信号
- C语言两种导入头文件的区别
- 一文读懂工业设备的两种通讯方式:现场总线和工业以太网
- android Calendar使用 年月日时分秒
- 【JVM】垃圾回收器
- 机器学习与计算机视觉(绘图)
- 类查找android中跨项目的数据库操作ContentProvider的使用
- Android 5.1 memory leak,Android 性能优化之使用MAT分析内存泄露问题
- 学完 Fluent 官方基础教程,你离一名合格Fluent 流体工程师还有多远?
- 转载:《七周成为数据分析师》
- html5家谱制作模板,Word如何做家谱世系图?
- 第十三届中国生物特征识别大会(CCBR2018)征文通知
- 计算机备课组小结,计算机备课组工作总结
- 高性能服务器设计[转自腾讯km,由qzhang同学翻译]
- 【通信】通信网络基础分类
- 如何免费识别图片文字?这几个软件彻底解放你的双手
- 多个独立索引和联合索引的选择
- python井字棋ai,python 井字棋(Tic Tac Toe)
- 在这个云时代,如何选择性价比更高的云服务器
热门文章
- 读书日赠书活动中奖名单公布!
- 年轻人秃了,这家公司却赚翻了
- 计算机考研科目887,2017年南京师范大学计算机科学与技术学院887数据库原理考研题库...
- 李明--linux教学视频 笔记 CH1----5
- linux查看Windows的ip命令,在windows系统和linux系统中查询IP地址命令的不同
- 机房收费系统—项目开发总结报告
- 【用例设计】浅谈兼容性测试
- 儿童玩耍电脑时间限制软件,定时锁屏软件,免费开源
- Ubuntu下运行Open WebOS
- lxm28au07m3x服务器不显示,Schneider LXM26DU07M3X 施耐德伺服控制器