好用的 map-struct 轉換庫 mergo
1. 前言
開發時,經常會碰到要把 map 轉成 struct,或者把 struct 轉成 map,方便數據處理。這個時候我們可以用到 mergo 。它非常簡單、好用,輔助我們更高效的開發。
2. 特性
mergo 有很多特性:
-
支持 struct 轉成 map
-
map 轉成 struct
-
支持各種選項,比如覆蓋寫等
-
… ….
更多功能特性請查看: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)
}
- 一些注意事項
-
mergo 不會複製非導出字段
-
map 使用時候,對應的 key 字段默認是小寫的
-
mergo 可以嵌套賦值
6. 總結
mergo
在很多知名項目有應用,比如 kubernetes 等,map 和 struct 快速轉換,也是很實用的一個功能。如果你在開發時候有這方面的需求,不妨試試看,相信一定會喜歡上的!
參考資料
- mergo ( _https://github.com/imdario/mergo _)
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/MH9vjR9ZMWzqd5aoOAAnlg