map在go语言中,是引用类型,当复制的时候,不能用map1 = map2 这样的值类型复制方式。
需要深度copy才行。
一、map复制的正确操作-深度copy
1.新建一个map
2.用for range 遍历原理的map,然后一一赋值给新的map
func TestCopy(t *testing.T) {
map1 := map[string]string{"1": "1", "2": "2", "3": "3"}
mp2 := make(map[string]string, len(map1))
for k, v := range map1 {
mp2[k] = v
}
fmt.Printf("[old] address: %p, values: %v\n", map1, map1)
fmt.Printf("[new] address: %p, values: %v\n", mp2, mp2)
t.Logf("修改map1中的一个值后")
map1["1"] = "100"
fmt.Printf("[old] address: %p, values: %v\n", map1, map1)
fmt.Printf("[new] address: %p, values: %v\n", mp2, mp2)
}
输出
[old] address: 0xc000060360, values: map[1:1 2:2 3:3]
[new] address: 0xc000060390, values: map[1:1 2:2 3:3]
修改map1中的一个值后
[old] address: 0xc000060360, values: map[1:100 2:2 3:3]
[new] address: 0xc000060390, values: map[1:1 2:2 3:3]
二、为什么引用类型不能简单的赋值copy
func TestCopy(t *testing.T) {
map1 := map[string]string{"1": "1", "2": "2", "3": "3"}
mp2 := map1
fmt.Printf("[old] address: %p, values: %v\n", map1, map1)
fmt.Printf("[new] address: %p, values: %v\n", mp2, mp2)
t.Logf("修改map1中的一个值后")
map1["1"] = "100"
fmt.Printf("[old] address: %p, values: %v\n", map1, map1)
fmt.Printf("[new] address: %p, values: %v\n", mp2, mp2)
}
[old] address: 0xc000092360, values: map[1:1 2:2 3:3]
[new] address: 0xc000092360, values: map[1:1 2:2 3:3]
修改map1中的一个值后
[old] address: 0xc000092360, values: map[1:100 2:2 3:3]
[new] address: 0xc000092360, values: map[1:100 2:2 3:3]
可见=赋值的时候,赋值的事引用的地址,修改map1(或mp2)中的一个值后,会发现另一个mp2(或map1)也跟着改变,两个map同步改变。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。