DeepCopy and MergeMaps for nested JSON-like values
Go
package clone
// DeepCopy recursively copies JSON-shaped maps and slices; scalars pass through.
func DeepCopy(v any) any {
switch t := v.(type) {
case map[string]any:
out := make(map[string]any, len(t))
for k, val := range t {
out[k] = DeepCopy(val)
}
return out
case []any:
out := make([]any, len(t))
for i, val := range t {
out[i] = DeepCopy(val)
}
return out
default:
return v
}
}
// MergeMaps deep-copies dst and recursively overlays src on top of it. Nested
// map[string]any values merge key by key; every other src value replaces dst.
func MergeMaps(dst, src map[string]any) map[string]any {
base, _ := DeepCopy(dst).(map[string]any)
if base == nil {
base = map[string]any{}
}
for k, sv := range src {
if dm, ok := base[k].(map[string]any); ok {
if sm, ok := sv.(map[string]any); ok {
base[k] = MergeMaps(dm, sm)
continue
}
}
base[k] = DeepCopy(sv)
}
return base
}