简介

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}

我们定义了两个结构体PersonCat,他们的字段有些许不同。现在,我们约定通信的 JSON 串中有一个type字段。当type的值为person时,该 JSON 串表示的是Person类型的数据。当type的值为cat时,该 JSON 串表示的是Cat类型的数据。

上面代码中,我们先用json.Unmarshal将字节流解码为map[string]interface{}类型。然后读取里面的type字段。根据type字段的值,再使用mapstructure.Decode将该 JSON 串分别解码为PersonCat类型的值,并输出。

实际上,Google Protobuf 通常也使用这种方式。在协议中添加消息 ID 或全限定消息名。接收方收到数据后,先读取协议 ID 或全限定消息名。然后调用 Protobuf 的解码方法将其解码为对应的Message结构。从这个角度来看,mapstructure也可以用于网络消息解码,如果你不考虑性能的话

Go 每日一库之 mapstructure相关推荐

  1. golang常用库之mapstructure包 | 多json格式情况解析、GO json 如何转化为 map 和 struct、Go语言结构体标签(Struct Tag)

    文章目录 golang常用库之mitchellh/mapstructure包 | go将map转换为struct 一.msgpack 二.背景 三.多json格式情况解析使用思路 四.mapstruc ...

  2. go get 失败 no go files in_Go 每日一库之 dig

    简介 今天我们来介绍 Go 语言的一个依赖注入(DI)库--dig.dig 是 uber 开源的库.Java 依赖注入的库有很多,相信即使不是做 Java 开发的童鞋也听过大名鼎鼎的 Spring.相 ...

  3. go float64 比较_Go 每日一库之 plot

    Go 每日一库之 plot 简介 本文介绍 Go 语言的一个非常强大.好用的绘图库--plot.plot内置了很多常用的组件,基本满足日常需求.同时,它也提供了定制化的接口,可以实现我们的个性化需求. ...

  4. go get 的不再src目录中_Go 每日一库之 sqlc:根据 sql 生成代码

    简介 在 Go 语言中编写数据库操作代码真的非常痛苦!database/sql标准库提供的都是比较底层的接口.我们需要编写大量重复的代码.大量的模板代码不仅写起来烦,而且还容易出错.有时候字段类型修改 ...

  5. go 默认http版本_【每日一库】超赞的 Go 语言 INI 文件操作

    点击上方蓝色"Go语言中文网"关注我们,领全套Go资料,每天学习 Go 语言 如果你使用 INI 作为系统的配置文件,那么一定会使用这个库吧.没错,它就是号称地表 最强大.最方便  ...

  6. go get如何删除_Go 每日一库之 xorm

    简介 Go 标准库提供的数据库接口database/sql比较底层,使用它来操作数据库非常繁琐,而且容易出错.因而社区开源了不少第三方库,如上一篇文章中的sqlc工具,还有各式各样的 ORM (Obj ...

  7. go 根据输入类型执行对应的方法_Go 每日一库之 sqlc

    简介 在 Go 语言中编写数据库操作代码真的非常痛苦!database/sql标准库提供的都是比较底层的接口.我们需要编写大量重复的代码.大量的模板代码不仅写起来烦,而且还容易出错.有时候字段类型修改 ...

  8. Go 每日一库之 zap

    转载地址:Go 每日一库之 zap - SegmentFault 思否 简介 在很早之前的文章中,我们介绍过 Go 标准日志库log和结构化的日志库logrus.在热点函数中记录日志对日志库的执行性能 ...

  9. 每日一库之Go 强大而灵活的电子邮件库:email

    发送邮件是一个很常见的需求:用户邮箱验证.邮箱召回等.Go 语言标准库自带 net/smtp 库,实现了 smtp 协议,用于发送邮件.然而这个库比较原始,使用不方便,而且官方声明不再增加新功能.于是 ...

最新文章

  1. 公司--As Imp的写法
  2. 非线性调频 matlab,非线性调频信号
  3. C语言两种导入头文件的区别
  4. 一文读懂工业设备的两种通讯方式:现场总线和工业以太网
  5. android Calendar使用 年月日时分秒
  6. 【JVM】垃圾回收器
  7. 机器学习与计算机视觉(绘图)
  8. 类查找android中跨项目的数据库操作ContentProvider的使用
  9. Android 5.1 memory leak,Android 性能优化之使用MAT分析内存泄露问题
  10. 学完 Fluent 官方基础教程,你离一名合格Fluent 流体工程师还有多远?
  11. 转载:《七周成为数据分析师》
  12. html5家谱制作模板,Word如何做家谱世系图?
  13. 第十三届中国生物特征识别大会(CCBR2018)征文通知
  14. 计算机备课组小结,计算机备课组工作总结
  15. 高性能服务器设计[转自腾讯km,由qzhang同学翻译]
  16. 【通信】通信网络基础分类
  17. 如何免费识别图片文字?这几个软件彻底解放你的双手
  18. 多个独立索引和联合索引的选择
  19. python井字棋ai,python 井字棋(Tic Tac Toe)
  20. 在这个云时代,如何选择性价比更高的云服务器

热门文章

  1. 读书日赠书活动中奖名单公布!
  2. 年轻人秃了,这家公司却赚翻了
  3. 计算机考研科目887,2017年南京师范大学计算机科学与技术学院887数据库原理考研题库...
  4. 李明--linux教学视频 笔记 CH1----5
  5. linux查看Windows的ip命令,在windows系统和linux系统中查询IP地址命令的不同
  6. 机房收费系统—项目开发总结报告
  7. 【用例设计】浅谈兼容性测试
  8. 儿童玩耍电脑时间限制软件,定时锁屏软件,免费开源
  9. Ubuntu下运行Open WebOS
  10. lxm28au07m3x服务器不显示,Schneider LXM26DU07M3X 施耐德伺服控制器