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 同步扭转。