一尘不染

如何复制map?

go

我正在尝试将地图 ( amap)的内容复制到另一个 ( aSuperMap) 中,然后清除, amap以便它可以在下一次迭代/循环中采用新值。问题是如果不清除超级地图中的引用,您就无法清除地图。这是一些伪代码。

for something := range fruits{
        aMap := make(map[string]aStruct)
        aSuperMap := make(map[string]map[string]aStruct)

        for x := range something{
            aMap[x] = aData
            aSuperMap[y] = aMap
            delete(aMap, x)
    }
//save aSuperMap
  saveASuperMap(something)

}

我也尝试了一些动态的东西,但显然它抛出了一个错误(不能分配给 nil)

aSuperMap[y][x] = aData

问题是如何创建关联地图?在 PHP 中,我只使用 aSuperMap[y][x] = aData。好像golang没有什么明显的方法。如果我delete(aMap, x)从超级地图中删除 它的引用,它也会被删除。如果我不删除它,超级地图最终会出现重复的数据。基本上在每个循环中,它都会获得aMap新值加上所有旧值。


阅读 349

收藏
2021-12-12

共1个答案

一尘不染

您不是在复制地图,而是在复制对地图的引用。您delete因此修改了原始地图和超级地图中的值。要复制地图,您必须使用这样的for循环:

for k,v := range originalMap {
  newMap[k] = v
}

这是现已停用的 SO 文档中的一个示例:

// Create the original map
originalMap := make(map[string]int)
originalMap["one"] = 1
originalMap["two"] = 2

// Create the target map
targetMap := make(map[string]int)

// Copy from the original map to the target map
for key, value := range originalMap {
  targetMap[key] = value
}
2021-12-12