1.前言

开发时,经常会碰到要把map转成struct,或者把struct转成map,方便数据处理。这个时候我们可以用到 mergo 。它非常简单、好用,辅助我们更高效的开发。

2.特性

mergo 有很多特性:

  • 支持struct转成map
  • map转成struct
  • 支持各种选项,比如覆盖写等
  • … ….

更多功能特性请查看:mergo

3.快速安装

直接get即可使用。

  1. $ go get -u github.com/imdario/mergo

4.简单举例

  1. package main
  2. import (
  3. "fmt"
  4. "log"
  5. "github.com/imdario/mergo"
  6. )
  7. type Student struct {
  8. Name string
  9. Num int
  10. Age int
  11. }
  12. func main() {
  13. var defaultStudent = Student{
  14. Name: "zhang—san",
  15. Num: 1,
  16. Age: 18,
  17. }
  18. var m = make(map[string]interface{})
  19. if err := mergo.Map(&m, defaultStudent); err != nil {
  20. log.Fatal(err)
  21. }
  22. fmt.Printf("map m = %+v", m)
  23. }

执行,控制台输出如下:

  1. map m = map[age:18 name:zhangsan num:1]

可以看到,struct赋值给map后,直接得到了结果。

5.设置淘汰时间举例

  1. package main
  2. import (
  3. "fmt"
  4. "log"
  5. "github.com/imdario/mergo"
  6. )
  7. type Student struct {
  8. Name string
  9. Num int
  10. Age int
  11. }
  12. func main() {
  13. var defaultStudent = Student{}
  14. var m = make(map[string]interface{})
  15. m["name"] = "lisi"
  16. m["num"] = 2
  17. m["age"] = 20
  18. if err := mergo.Map(&defaultStudent, m); err != nil {
  19. log.Fatal(err)
  20. }
  21. fmt.Printf("struct defaultStudent = %+v", defaultStudent)
  22. }

执行,控制台输出如下:

  1. struct defaultStudent = {Name:lisi Num:2 Age:20}

可以看到,map赋值给struct后,直接得到了结果。

6.常用特性举例

6.1 覆盖写特性 比如map赋值给结构体,但是结构体中已经有了初始值,默认不覆盖,覆盖需要添加 WithOverride 特性

  1. if err := mergo.Map(&m, defaultStudent, mergo.WithOverride); err != nil {
  2. log.Fatal(err)
  3. }

6.2 slice赋值 可以把切片直接复制过去

  1. if err := mergo.Map(&m, defaultStudent, mergo.WithAppendSlice); err != nil {
  2. log.Fatal(err)
  3. }

6.3 slice赋值,并覆盖原来的 直接结合两个参数使用

  1. if err := mergo.Map(&m, defaultStudent, mergo.WithAppendSlice, mergo.WithOverride); err != nil {
  2. log.Fatal(err)
  3. }

7.一些注意事项

  • mergo 不会复制非导出字段
  • map 使用时候,对应的key字段默认是小写的
  • mergo 可以嵌套赋值

    6.总结

    mergo 在很多知名项目有应用,比如 kubernetes 等,map 和 struct 快速转换,也是很实用的一个功能。如果你在开发时候有这方面的需求,不妨试试看,相信一定会喜欢上的!

    参考资料

  • mergo ( https://github.com/imdario/mergo )