mapx 是一个 Golang 的 map 工具包,包含一些常见的 map 使用快捷方法。
你可以通过以下方式使用 mapx 包:
import "github.com/TencentBlueKing/gopkg/mapx"
判断 key 是否存在于 map 中。
m := map[string]interface{}{"k1": "v1"}
// true
mapx.ExistsKey(m, "k1")
// false
mapx.ExistsKey(m, "k2")
对两个 map 进行对比,输出差异项,支持比较子项。
备注
- 子项比较只支持
[]interface{}
,map[string]interface{}
- 若某个 key 包含
.
则输出结果中会包含小括号,如[]string{"k1", "k2.2", "k3"} -> "k1.(k2.2).k3"
- 更多样例参考 differ_test.go
o := map[string]interface{}{
"k1": "v1",
"k2": "v2",
"k3": map[string]interface{}{
"k4": "v4",
},
}
n := map[string]interface{}{
"k1": "v1.1",
"k3": map[string]interface{}{
"k4": "v4.1",
},
"k5": "v5",
}
/*
[
{"Add", "k5", <nil>, "v5"}
{"Change", "k1", "v1", "v1.1"}
{"Change", "k3.k4", "v4", "v4.1"}
{"Remove", "k2", "v2", <nil>}
]
*/
diffRets := mapx.NewDiffer(o, n).Do()
for _, r := range diffRets {
/*
Add k5: v5
Change k1: v1 -> v1.1
Change k3.k4: v4 -> v4.1
Remove k2: v2
*/
s := r.Repr()
}
根据指定路径从嵌套的 map[string]interface{}
获取 value 的方法。
m := map[string]interface{}{
"a1": map[string]interface{}{
"b1": map[string]interface{}{
"c1": map[string]interface{}{
"d1": "v1",
"d2": "v2",
"d.3": 3,
},
},
},
}
// d1val: v1
d1Val, _ := mapx.GetItems(m, "a1.b1.c1.d1")
// 路径中某 key 存在 `.`,可使用 []string 作为参数
// dDot3Val: 3
dDot3Val, _ := mapx.GetItems(m, []string{"a1", "b1", "c1", "d.3"})
// key 不存在或某中间值类型非 map[string]interface{},返回错误
// err: key c2 not exist
_, err := mapx.GetItems(m, "a1.b1.c2")
GetItems
的快捷方法,支持设置默认值,当 GetItems
返回的 err != nil
时,返回默认值。
m := ...
// d1val: v1
d1Val := mapx.Get(m, "a1.b1.c1.d1", "default")
// c2Val: default
c2Val := mapx.GetItems(m, "a1.b1.c2", "default")
Get
的快捷方法,默认返回值为 false
Get
的快捷方法,默认返回值为 int64(0)
Get
的快捷方法,默认返回值为 ""
Get
的快捷方法,默认返回值为 []interface{}{}
Get
的快捷方法,默认返回值为 map[string]interface{}{}
根据指定路径向嵌套的 map[string]interface{}
设置 value 的方法。
m := map[string]interface{}{
"a1": map[string]interface{}{
"b1": map[string]interface{}{
"c1": []interface{}{
"d1", "d2", "d3",
},
},
},
}
/*
m = map[string]interface{}{
"a1": map[string]interface{}{
"b1": map[string]interface{}{
"c1": []interface{}{
"d1", "d2", "d3",
},
"c2": "d4",
},
},
}
*/
_ = mapx.SetItems(m, "a1.b1.c2", "d4")
// 当某中间值不存在或其值非 `map[string]interface{}`,返回错误
// err: key c1 not exists or obj[key] not map[string]interface{} type
err := mapx.SetItems(m, "a1.b1.c1.d1", "d5")