Go 中的深度复制和清除映射
在使用关联数据结构时,通常需要创建映射的深度复制和然后清除原来的值以接受新值。然而,在 Go 中,简单地将引用分配给映射不会创建深层复制,从而导致清除原始映射的问题。
问题
考虑以下代码:
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 }
在此代码中,我们尝试将 aMap 的深层副本创建到 aSuperMap 中,然后清除 aMap,以便它可以采用新的价值观。但是,从 aMap 中删除元素也会从 aSuperMap 中删除它,因为两个映射都引用相同的基础数据。
解决方案
创建 a 的真正深层副本Go中的map,必须使用for循环手动将每个键值对从原始map复制到新的map map:
for k, v := range originalMap { newMap[k] = v }
这将创建一个新地图 newMap,它独立于原始地图 OriginalMap。
清除原始地图
创建地图的深层副本后,可以使用内置的 len() 清除原始地图函数:
length := len(aMap) for i := 0; i < length; i++ { for key := range aMap { delete(aMap, key) } }
这将从 aMap 中删除所有元素,同时保持 aSuperMap 的内容完好无损。
以上是如何在Go中深度复制和清除地图?的详细内容。更多信息请关注PHP中文网其他相关文章!