golang 从 map 获取值时的值拷贝问题

2022-03-14  本文已影响0人  sarto

实际场景

type Cookies map[string]Cookie

func (c *client) getCookie(key string) (Cookie,bool) {
    c.mu.RLock()
    defer c.mu.RUnlock()
    cookie, ok := c.cookies[key];
    return cookie, ok
}

我们知道 golang 中,slice, map, channel 是引用类型,函数之间传递都是以值拷贝的形式进行的,引用类型经过函数传递,依然是引用类型。
在上述例子中,我们从 map 中想拿出一个值,这个值是一个简单结构体,拿出这个值后,不确定这个值和 map 中的值是什么关系,如果不小心修改,是否会造成 map 值变更。
我们希望 golang 中更多的是值传递,这样能避免数据存储在堆上,造成 gc 负担。

测试验证

type A struct {
    num int
}
func TestCase(t *testing.T) {
    m := map[int]A {
        1:A{num: 1},
    }

    a := m[1]
    fmt.Printf("%+v\n",a)
    fmt.Printf("%+v\n",m)

    a.num = 2
    fmt.Printf("%+v\n",a)
    fmt.Printf("%+v\n",m)
}

=== RUN   TestCase
{num:1}
map[1:{num:1}]
{num:2}
map[1:{num:1}]

可以看到,修改值后,map 中的值保持不变。说明 map 获取的值也是值传递出来的。

上一篇 下一篇

猜你喜欢

热点阅读