Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 戈朗深度复制地图_Json_Go_Maps_Deep Copy - Fatal编程技术网

Json 戈朗深度复制地图

Json 戈朗深度复制地图,json,go,maps,deep-copy,Json,Go,Maps,Deep Copy,据我所知,地图是围棋中的参考类型。所以作业会做浅拷贝。我计划在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 cann

据我所知,地图是围棋中的参考类型。所以作业会做浅拷贝。我计划在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]的地址。(映射[string]接口{}) 我该怎么做?有没有其他方法来制作深度地图


我在golang学习了map的内部结构,这也会很有用。

我想到了两种解决方案

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
        }
    }
}

我想到了两种解决方案

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
        }
    }
}

无需将
dest
作为指针传递,因为您只需在映射中设置条目。我被
((*dest)[key])(map[string]接口{})弄糊涂了。您只需将其设置为
map[string]int
,因此
map[string]interface{}
的类型断言将失败。你想在那里做什么?@AndySchweig当我没有键入assert时,我得到以下错误
不能使用&(*dest)[key](type*interface{})作为deepCopyJSON的参数中的type*map[string]interface{}类型断言可以避免编译器错误,但是断言在运行时会失败,因为该值是
map[string]int
@AndySchweig即使删除了断言,它也不会编译。该错误与原始错误加上类型错误相同
#cncli/client../client/util.go:44:49:无法获取(*dest)[key]../client/util.go:44:49:无法将&(*dest)[key](type*interface{})用作deepCopyJSON的参数中的type*映射[string]interface{}您有两个问题。您不能获取类型断言的地址,并且类型断言无论如何也不会工作。首先,不要将该映射作为指针传递。正如我前面提到的,这是没有必要的。但是还有一个更基本的问题,那就是您正在创建一个
map[string]int
,函数需要一个
map[string]接口{}
。这些是不同的类型。为什么元素类型为int
?它不应该是
interface{}
?没有必要将
dest
作为指针传递,因为您只是在映射中设置条目。我被
((*dest)[key])(map[string]接口{})弄糊涂了。您只需将其设置为
map[string]int
,因此
map[string]interface{}
的类型断言将失败。你想在那里做什么?@AndySchweig当我没有键入assert时,我得到以下错误
不能使用&(*dest)[key](type*interface{})作为deepCopyJSON的参数中的type*map[string]interface{}类型断言可以避免编译器错误,但是断言在运行时会失败,因为该值是
map[string]int
@AndySchweig即使删除了断言,它也不会编译。该错误与原始错误加上类型错误相同
#cncli/client../client/util.go:44:49:无法获取(*dest)[key]../client/util.go:44:49:无法将&(*dest)[key](type*interface{})用作deepCopyJSON的参数中的type*映射[string]interface{}您有两个问题。您不能获取类型断言的地址,并且类型断言无论如何也不会工作。首先,不要将该映射作为指针传递。正如我前面提到的,这是没有必要的。但是还有一个更基本的问题,那就是您正在创建一个
map[string]int
,函数需要一个
map[string]接口{}
。这些是不同的类型。为什么元素类型为int
?它不应该是
接口{}