Getting the union of two maps in go
There is no built in way, nor any method in the standard packages to do such a merge.
The idomatic way is to simply iterate:
for k, v := range b {
a[k] = v
}
If you have a couple of nested maps, left
and right
, then this function will recursively add the items from right
into left
. If the key is already in left
then we recurse deeper into the structure and attempt only add keys to left
(e.g. never replace them).
type m = map[string]interface{}
// Given two maps, recursively merge right into left, NEVER replacing any key that already exists in left
func mergeKeys(left, right m) m {
for key, rightVal := range right {
if leftVal, present := left[key]; present {
//then we don't want to replace it - recurse
left[key] = mergeKeys(leftVal.(m), rightVal.(m))
} else {
// key not in left so we can just shove it in
left[key] = rightVal
}
}
return left
}
NOTE: I do not handle the case in which the value is not itself a map[string]interface{}
. So if you have left["x"] = 1
and right["x"] = 2
then the above code will panic when attempting leftVal.(m)
.