回答

收藏

如何复制map?

技术问答 技术问答 267 人阅读 | 0 人回复 | 2023-09-12

我正试把地图 ( )amap)将内容复制到另一个 ( aSuperMap) 中,然后清除,amap这样它就可以在下一个迭代/循环中使用新的值。问题是,如果你不清除超级地图中的引用,你就不能清除地图。这是一些伪代码。
0 z' O" H& E5 _4 G, g) i, I" H" q
    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)}9 O5 ^6 m/ ]" o& f' V! e$ U
我也尝试了一些动态的东西,但很明显抛出了一个错误(不能分配给 nil)9 U) `- A: g- R1 f( N) o. f
    aSuperMap[y][x] = aData
    / v. v" ?3 ^  P" K
问题是如何创建相关地图?PHP 中,我只用 aSuperMap[y][x] = aData。好像golang没有明显的办法。delete(aMap,x)从超级地图中删除 它的参考,它也将被删除。如果我不删除它,超级地图最终会有重复的数据。基本上,它会在每个循环中获得aMap新值加上所有旧值。
! a( ~! {6 C6 c# H. o* V6 p                                                                : o* V4 H' d& i  x/ `0 U, G8 G
    解决方案:                                                               
! q/ k) v3 o) U. T/ A- C" b, Y                                                                你不是在复制地图,而是在复制引用地图。delete因此,对原始地图和超级地图中的值进行了修改。要复制地图,你必须使用它for循环:6 W0 N* [5 L! W5 s
    for k,v := range originalMap {  newMap[k] = v}
    4 P! v) S& t' p% u7 L5 u+ W# f
这是已停止的 SO 文档中的一个示例:1 A9 Z7 Z; V  R- ~5 d: u
    // Create the original maporiginalMap := make(map[string]int)originalMap["one"] = 1originalMap["two"] = 2// Create the target maptargetMap := make(map[string]int)// Copy from the original map to the target mapfor key,value := range originalMap {  targetMap[key] = value}" [; y$ I4 S$ Q/ F
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则