在Go中复制map的教程

2,274 阅读1分钟

Go中的地图是引用类型,所以要深度复制一个地图的内容,你不能把一个实例分配给另一个。你可以通过创建一个新的、空的地图,然后在for range 循环中迭代旧的地图,将适当的键值对分配到新的地图中。这是Go中解决这个问题的最简单和最有效的方法。

package main
import "fmt"
func main() {
fruitRank := map[string]int{
"strawberry": 1,
"blueberry": 2,
"raspberry": 3,
}
// copy a map
 fruitRankCopy := make(map[string]int)
for k, v := range fruitRank {
fruitRankCopy[k] = v
}
fruitRankCopy["apple"] = 4
fmt.Println("original map")
fmt.Println(fruitRank)
fmt.Println("copied map")
fmt.Println(fruitRankCopy)
}

输出结果:

original map
map[blueberry:2 raspberry:3 strawberry:1]
copied map
map[apple:4 blueberry:2 raspberry:3 strawberry:1]

正如你在输出中看到的,复制的地图是一个深层克隆,添加新元素不会影响旧地图。


当通过将一个地图分配给另一个地图来进行浅层复制时要小心。在这种情况下,任何一个地图的修改都会导致两个地图的数据发生变化。

package main
import "fmt"
func main() {
fruitRank := map[string]int{
"strawberry": 1,
"blueberry": 2,
"raspberry": 3,
}
fruitRankShallowCopy := fruitRank
fruitRankShallowCopy["apple"] = 4
fmt.Println("original map")
fmt.Println(fruitRank)
fmt.Println("copied map")
fmt.Println(fruitRankShallowCopy)
}

输出:

original map
map[apple:4 blueberry:2 raspberry:3 strawberry:1]
copied map
map[apple:4 blueberry:2 raspberry:3 strawberry:1]