实际场景
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 获取的值也是值传递出来的。
网友评论