好用的 map-struct 轉換庫 mergo

1. 前言

開發時,經常會碰到要把 map 轉成 struct,或者把 struct 轉成 map,方便數據處理。這個時候我們可以用到 mergo 。它非常簡單、好用,輔助我們更高效的開發。

2. 特性

mergo 有很多特性:

更多功能特性請查看:mergo

3. 快速安裝

直接 get 即可使用。

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

4. 簡單舉例

package main

import (
 "fmt"
 "log"

 "github.com/imdario/mergo"
)

type Student struct {
 Name string
 Num  int
 Age  int
}

func main() {
 var defaultStudent = Student{
  Name: "zhang—san",
  Num:  1,
  Age:  18,
 }

 var m = make(map[string]interface{})
 if err := mergo.Map(&m, defaultStudent); err != nil {
  log.Fatal(err)
 }

 fmt.Printf("map m = %+v", m)
}

執行,控制檯輸出如下:

map m = map[age:18 name:zhang—san num:1]

可以看到,struct 賦值給 map 後,直接得到了結果。

5. 設置淘汰時間舉例

package main

import (
 "fmt"
 "log"

 "github.com/imdario/mergo"
)

type Student struct {
 Name string
 Num  int
 Age  int
}

func main() {
 var defaultStudent = Student{}

 var m = make(map[string]interface{})
 m["name"] = "lisi"
 m["num"] = 2
 m["age"] = 20

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

 fmt.Printf("struct defaultStudent = %+v", defaultStudent)
}

執行,控制檯輸出如下:

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

可以看到,map 賦值給 struct 後,直接得到了結果。

6. 常用特性舉例

6.1 覆蓋寫特性 比如 map 賦值給結構體,但是結構體中已經有了初始值,默認不覆蓋,覆蓋需要添加 WithOverride 特性

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

6.2 slice 賦值 可以把切片直接複製過去

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

6.3 slice 賦值,並覆蓋原來的 直接結合兩個參數使用

    if err := mergo.Map(&m, defaultStudent, mergo.WithAppendSlice, mergo.WithOverride); err != nil {
        log.Fatal(err)
    }
  1. 一些注意事項

6. 總結

mergo 在很多知名項目有應用,比如 kubernetes 等,map 和 struct 快速轉換,也是很實用的一個功能。如果你在開發時候有這方面的需求,不妨試試看,相信一定會喜歡上的!

參考資料

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/MH9vjR9ZMWzqd5aoOAAnlg