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同步扭转。
发表回复