好用的map-struct转换库mergo-《GO开发知识笔记》

admin 2025-11-04 00:56:47 编程 来源:ZONE.CI 全球网 0 阅读模式
  • 1.前言
  • 2.特性
  • 3.快速安装
  • 4.简单举例
  • 5.设置淘汰时间举例
  • 6.常用特性举例
  • 7.一些注意事项
  • 6.总结
  • 参考资料

    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:zhang—san 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 )

    以太坊cppgolang区别 编程

    以太坊cppgolang区别

    以太坊是一种去中心化的开源平台,它采用智能合约技术,旨在构建和运行不受干扰的分布式应用程序。作为目前最受欢迎的区块链平台之一,以太坊提供了多种编程语言的支持,其
    progolang 编程

    progolang

    Go语言(Golang)是由Google开发的一门静态类型编程语言。作为一名专业的Golang开发者,我深知这门语言的优势和特点。在本文中,我将介绍Golang
    golangn个发送者 编程

    golangn个发送者

    Golang是一种开源的编程语言,由Google团队开发,旨在提高程序的并发性和简化软件开发过程。在Go语言中,有时需要向多个接收者发送信息。本文将介绍如何在G
    golang技能图谱 编程

    golang技能图谱

    从互联网行业的快速发展到人工智能技术的日益成熟,各种编程语言也应运而生。而在这众多的编程语言中,Golang(即Go)作为一门强大且高效的开发语言备受关注。Go
    评论:0   参与:  11