Posted
技术标签:
【中文标题】在 Golang 中合并地图【英文标题】:Merge Maps in Golang 【发布时间】:2018-10-23 18:38:49 【问题描述】:map1 = [ id: id_1 val: val_1 ]map2 = [ id: id_2 val: val_2 ]map3 = [id: id_1, val: val_3]id
result_map = [id: id_1 val: val_1, val_3, id: id_2 var: val_2 ]
我试过的代码:
var a = make(map[string]interface)
for _, m := range data
for _, n := range data
if m["id"] == n["id"]
for l, k := range n
c[l] = k
有没有办法做到这一点?我正在使用 Golang 1.7
谢谢
【问题讨论】:
你试过什么?你遇到了什么问题?包括您的代码、您收到的输出和/或错误,以及您的预期。 另外,停止使用 Go 1.7,它甚至不再受支持。当前最新的是 1.10.2。 感谢您使用代码更新您的问题。这段代码有什么问题? 【参考方案1】:简单合并
map[string][]string
要进行合并,只需对要合并的映射进行范围划分,然后将源映射中的每个值附加到与结果映射中相同键关联的切片。
需要注意的一点是,在执行追加操作后,您必须将结果切片分配回结果映射中的相同键。
这是一个简单的实现:
func merge(ms ...map[string]string) map[string][]string
res := map[string][]string
for _, m := range ms
for k, v := range m
res[k] = append(res[k], v)
return res
merge()
nilnilappend()
测试它:
m1 := map[string]string"id_1": "val_1"
m2 := map[string]string"id_2": "val_2"
m3 := map[string]string"id_1": "val_3"
res := merge(m1, m2, m3)
fmt.Println(res)
输出(在Go Playground上试试):
map[id_1:[val_1 val_3] id_2:[val_2]]
避免重复
merge()"id_1": "val_1""id_1": ["val_1", "val_1", "val_x"]
这是可以做到的:
func merge(ms ...map[string]string) map[string][]string
res := map[string][]string
for _, m := range ms
srcMap:
for k, v := range m
// Check if (k,v) was added before:
for _, v2 := range res[k]
if v == v2
continue srcMap
res[k] = append(res[k], v)
return res
测试它:
m1 := map[string]string"id_1": "val_1"
m2 := map[string]string"id_2": "val_2", "id_1": "val_1"
m3 := map[string]string"id_1": "val_3"
res := merge(m1, m2, m3)
fmt.Println(res)
输出(在Go Playground上试试):
map[id_1:[val_1 val_3] id_2:[val_2]]
"id_1": "val_1"m1m2"val_1""id_1"
【讨论】:
它不适用于切片中的重复值尝试使用github.com/fatih/set @danicheeta 是的,重复值将被列出多次。这可能是提问者想要的,也可能不是,他没有说什么。"id_1": "val_1""id_1": ["val_1", "val_x", "val_1"]
@icza,您在 srcMap 中使用了 for 循环。它是什么控制结构。 1.7是否支持
msm
以上是关于在 Golang 中合并地图的主要内容,如果未能解决你的问题,请参考以下文章