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
}