据我所知,map是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)键的地址。(mapstringinterface {})我该如何解决这个问题?还有没有其他方法来绘制深度地图?
我的入门教程,在高朗地图上,也会很有用。
发布于 2018-08-04 19:55:37
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
}发布于 2018-08-04 18:37:37
我想到了两个解决方案。
1)简单地mashal它回来,然后复制字节。
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://stackoverflow.com/questions/51459083
复制相似问题