Merge two or more interfaces [] map [string] interface {} into one in Golang

I use Golang and for some reason I need to combine the results from different database queries, all of which return me []map[string]interface{} I think of Append, but its just not clear enough if possible. What is the final data type I'm looking at?

Obviously, an array of interface cards with keys as strings should be able to simply "attach" (concat, if possible) to another array of interface cards with keys as strings!

So what is the mechanism to achieve this?

+5
source share
2 answers

Even the answer is already given in the comments above. I will post a short example of how this can be achieved.

 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) } 

The output will be:

 [map[one:1 two:2] map[three:3 four:4]] 

Playground Example

+7
source

The other answer is correct. You can also write a helper function to avoid re-merging maps.

 // 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)) } 
+3
source

All Articles