首页 > 后端开发 > Golang > 如何深度复制Go Map并清除原始而不影响复制?

如何深度复制Go Map并清除原始而不影响复制?

Susan Sarandon
发布: 2024-12-30 13:05:09
原创
497 人浏览过

How to Deep Copy a Go Map and Clear the Original Without Affecting the Copy?

在 Go 中创建关联映射:如何深度复制并清除原始内容

在 Go 中,您正在尝试复制内容将一个名为 aMap 的映射转换为另一个名为 aSuperMap 的映射。随后,您希望清除 aMap 以在下一次循环迭代中接受新值。但是,您面临着清除地图而不清除 aSuperMap 中的引用的问题。

引用问题

您的伪代码说明了当您删除使用delete(aMap, x)从aMap中删除一个项目,对该项目的引用也会从aSuperMap中删除。这是因为 aSuperMap[y] 保存了对 aMap 的引用,当您修改 aMap(在本例中是通过删除某个项目)时,您实际上是在修改 aSuperMap 指向的基础数据。

深度复制映射

要在 Go 中真正创建关联映射,您需要执行映射的深度复制。这涉及到使用自己的数据副本创建一个新的地图对象,而不是简单地保存对原始地图的引用。

您可以通过手动创建一个 for 循环来迭代原始地图并添加每个键值对到新地图:

for k, v := range originalMap {
    newMap[k] = v
}
登录后复制

通过这样做,您创建了一个新地图,其中包含与原始地图相同的数据,但这两个地图是单独的对象,具有自己的副本

清除原始地图

拥有地图的深层副本后,您可以清除原始地图,而不会影响新地图。为此,您可以使用 container/list 包中的重置功能:

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

    // Deep copy aMap into newMap
    newMap := make(map[string]aStruct)
    for k, v := range aMap {
        newMap[k] = v
    }

    // Clear the original aMap
    container/list.Reset(aMap)

    // Save the new map
    saveASuperMap(newMap)
}
登录后复制

按照以下步骤,您可以在 Go 中成功创建关联映射,执行映射的深层复制以保留原始数据,并清除原始映射以在下一次循环迭代中接受新值。

以上是如何深度复制Go Map并清除原始而不影响复制?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板