关于go:go语言map复制

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

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理