关于go:go语言map复制

9次阅读

共计 1313 个字符,预计需要花费 4 分钟才能阅读完成。

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

正文完
 0