在 Golang 中将两个或多个 []map[string]interface{} 类型合并为一个
Merge two or more []map[string]interface{} types into one in Golang
我正在使用 Golang,出于某种原因,我需要合并来自不同数据库查询的结果,所有这些 return 我 []map[string]interface{}
我正在考虑追加,但如果这可能的话,它还不够清楚。
我正在查看的最终数据类型是什么?
显然,一个以字符串为键的接口映射数组应该能够简单地'attach'(如果可以的话,连接)到另一个以字符串为键的接口映射数组!
那么实现这个的机制是什么?
即使上面的评论中已经给出了答案,我也会 post 一个如何实现的简短示例。
package main
import (
"fmt"
)
func main() {
result := []map[string]interface{}{}
mp1 := map[string]interface{}{
"one" : 1,
"two" : 2,
}
mp2 := map[string]interface{}{
"three" : 3,
"four" : 4,
}
mp3 := make(map[string]interface{})
for k, v := range mp1 {
if _, ok := mp1[k]; ok {
mp3[k] = v
}
}
for k, v := range mp2 {
if _, ok := mp2[k]; ok {
mp3[k] = v
}
}
result = append(result, mp1, mp2)
fmt.Println(result)
}
输出将是:
[map[one:1 two:2] map[three:3 four:4]]
另一个答案是正确的。您还可以编写一个辅助函数来避免重复的地图合并。
// overwriting duplicate keys, you should handle that if there is a need
func mergeMaps(maps ...map[string]interface{}) map[string]interface{} {
result := make(map[string]interface{})
for _, m := range maps {
for k, v := range m {
result[k] = v
}
}
return result
}
func main() {
log.Println(`started`)
v := []map[string]interface{}{
map[string]interface{}{
`one`: 1,
`two`: 2,
},
map[string]interface{}{
`one`: `I`,
`three`: 3,
`other`: `NAN`,
},
map[string]interface{}{
`name`: `Bob`,
`age`: 300,
},
}
m := mergeMaps(v...)
log.Println(m, len(m))
}
上述解决方案由Endre and Kaveh both works, but it is much simpler, handy, and more optimized to use mergo建议,当一个人想要合并Go结构和地图时,除了合并地图之外,涵盖了广泛的场景[string]接口{}
package main
import (
"fmt"
"github.com/imdario/mergo"
)
func main() {
mp1 := map[string]interface{}{
"one" : 1,
"two" : 2,
}
mp2 := map[string]interface{}{
"three" : 3,
"four" : 4,
}
mergo.Merge(&mp1, mp2) //mergo.Merge(&dest,src)
fmt.Println(mp1)
}
输出:
map[four:4 one:1 three:3 two:2]
P.S。 - 在 Golang 中没有保序。实际上,在 Go 中迭代 map 总是以随机顺序进行。所以不要依赖地图的键顺序。
我正在使用 Golang,出于某种原因,我需要合并来自不同数据库查询的结果,所有这些 return 我 []map[string]interface{}
我正在考虑追加,但如果这可能的话,它还不够清楚。
我正在查看的最终数据类型是什么?
显然,一个以字符串为键的接口映射数组应该能够简单地'attach'(如果可以的话,连接)到另一个以字符串为键的接口映射数组!
那么实现这个的机制是什么?
即使上面的评论中已经给出了答案,我也会 post 一个如何实现的简短示例。
package main
import (
"fmt"
)
func main() {
result := []map[string]interface{}{}
mp1 := map[string]interface{}{
"one" : 1,
"two" : 2,
}
mp2 := map[string]interface{}{
"three" : 3,
"four" : 4,
}
mp3 := make(map[string]interface{})
for k, v := range mp1 {
if _, ok := mp1[k]; ok {
mp3[k] = v
}
}
for k, v := range mp2 {
if _, ok := mp2[k]; ok {
mp3[k] = v
}
}
result = append(result, mp1, mp2)
fmt.Println(result)
}
输出将是:
[map[one:1 two:2] map[three:3 four:4]]
另一个答案是正确的。您还可以编写一个辅助函数来避免重复的地图合并。
// overwriting duplicate keys, you should handle that if there is a need
func mergeMaps(maps ...map[string]interface{}) map[string]interface{} {
result := make(map[string]interface{})
for _, m := range maps {
for k, v := range m {
result[k] = v
}
}
return result
}
func main() {
log.Println(`started`)
v := []map[string]interface{}{
map[string]interface{}{
`one`: 1,
`two`: 2,
},
map[string]interface{}{
`one`: `I`,
`three`: 3,
`other`: `NAN`,
},
map[string]interface{}{
`name`: `Bob`,
`age`: 300,
},
}
m := mergeMaps(v...)
log.Println(m, len(m))
}
上述解决方案由Endre and Kaveh both works, but it is much simpler, handy, and more optimized to use mergo建议,当一个人想要合并Go结构和地图时,除了合并地图之外,涵盖了广泛的场景[string]接口{}
package main
import (
"fmt"
"github.com/imdario/mergo"
)
func main() {
mp1 := map[string]interface{}{
"one" : 1,
"two" : 2,
}
mp2 := map[string]interface{}{
"three" : 3,
"four" : 4,
}
mergo.Merge(&mp1, mp2) //mergo.Merge(&dest,src)
fmt.Println(mp1)
}
输出:
map[four:4 one:1 three:3 two:2]
P.S。 - 在 Golang 中没有保序。实际上,在 Go 中迭代 map 总是以随机顺序进行。所以不要依赖地图的键顺序。