美文网首页
golang 从 map 获取值时的值拷贝问题

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

作者: sarto | 来源:发表于2022-03-14 15:28 被阅读0次

实际场景

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 获取的值也是值传递出来的。

相关文章

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

    实际场景 我们知道 golang 中,slice, map, channel 是引用类型,函数之间传递都是以值拷贝...

  • go学习笔记(一)

    (1)从map中取值问题可以对未初始化的map进行取值,但取值来的是对应类型的零值。但不能对未初始化的map进行赋...

  • golang使用技巧

    golang map赋值是引用拷贝 返回值 可以放入一行中 go tools 里面支持vscode跳转 go语言c...

  • golang语言map的并发和排序

    golang语言map的并发和排序 map的并发问题 golang缺省的map不是thread safe的,如果存...

  • golang小知识

    golang这门语言中没有深拷贝。浅拷贝是拷贝值以及值中直接包含的东西。深拷贝是连同结构一块拷贝。 通道是将gor...

  • 后端研发体系

    记录自己为了面试发现的文章 golang golang中都是值传递,没有引用传递,哪怕是指针,也是指针的值拷贝。 ...

  • go和python的深浅拷贝理解

    go深拷贝, 就是拷贝值 go浅拷贝, 拷贝引用 go中赋值就能实现拷贝,针对引用类型(slice,map,cha...

  • map中排序

    map实现根据key值排列,必须先用切片取出key所有值,排序后,再从map中获取值 一、代码、、、package...

  • leetcode26. 删除排序数组中的重复项

    可以利用golang的map结构,key值唯一的特性。

  • 深拷贝和常见一些坑

    golang 完全是按值传递,所以正常的赋值都是值拷贝,当然如果类型里面嵌套的有指针,也是指针值的拷贝,此时就会出...

网友评论

      本文标题:golang 从 map 获取值时的值拷贝问题

      本文链接:https://www.haomeiwen.com/subject/jaajdrtx.html