Golang 中的深度复制地图

Deep copying maps in Golang

据我了解,映射是 Go 中的引用类型。所以赋值会做浅拷贝。我计划在 golang 中对地图进行递归深度复制。递归,因为我正在处理一个包含 JSON.

的未编组内容的地图
func deepCopyJSON(src map[string]interface{}, dest *map[string]interface{}) error {
    if src == nil || dest == nil {
        return errors.New("src/dest is nil. You cannot insert to a nil map")
    }
    for key, value := range src {
        if reflect.TypeOf(value).String() != jsonType {
            (*dest)[key] = value
        } else {
            (*dest)[key] = make(map[string]int)
//Suspect code below causes the error.
            deepCopyJSON(value.(map[string]interface{}), &(((*dest)[key]).(map[string]interface{})))
        }
    }
    return nil
}

错误:无法获取 (*dest)[key].(map[string]interface {}) 的地址 我该如何解决这个问题?有没有其他方法可以深入地图?

我介绍了 golang 中 map 的内部结构,也会很有用。

我想到了2个方案。

1) 只需将其混搭,然后复制字节。

2) 递归调用如下。

func deepCopyJSON(src map[string]interface{}, dest map[string]interface{}) {
    for key, value := range src {
        switch src[key].(type) {
        case map[string]interface{}:
            dest[key] = map[string]interface{}{}
            deepCopyJSON(src[key].(map[string]interface{}), dest[key].(map[string]interface{}))
        default:
            dest[key] = value
        }
    }
}

https://play.golang.org/p/l6W1PD4lppG

func deepCopyJSON(src map[string]interface{}, dest map[string]interface{}) error {
    if src == nil {
        return errors.New("src is nil. You cannot read from a nil map")
    }
    if dest == nil {
        return errors.New("dest is nil. You cannot insert to a nil map")
    }
    jsonStr, err := json.Marshal(src)
    if err != nil {
        return err
    }
    err = json.Unmarshal(jsonStr, &dest)
    if err != nil {
        return err
    }
    return nil
}