【问题标题】:golang map value returned by value or reference? [duplicate]通过值或引用返回的golang映射值? [复制]
【发布时间】:2017-07-26 08:34:14
【问题描述】:

让我有一个带有字符串键和指向结构的指针值的映射

type Entity struct{}
entity := &Entity{}
m := map[string]*Entity{"foo":entity}

我得到值并稍后删除条目

en := m["foo"]
delete(m, "foo")

我的问题是,由于指向它的指针已从映射中删除,内存是否会被垃圾回收?另一方面,我在删除条目之前有新的指针 en,它是指针的副本也指向相同的内存位置,因此即使映射条目也不会被垃圾收集内存被删除?我很困惑,感谢您的帮助。

【问题讨论】:

  • 感谢@icza 指向另一个帖子已经有了答案。
  • 这段代码sn-p表明如果使用另一个指针来存储地址play.golang.org/p/YC4ax6k6dm,内存不会被垃圾回收
  • 我不明白这完全是一个骗局——将一个条目放入映射中是返回一个指向该条目的指针还是一个副本?似乎在我的测试中它返回了一个真的很垃圾的副本

标签: go


【解决方案1】:

Go 当前的实现是parallel mark-and-sweep 垃圾收集器。

确切地说,在声明 entity 的范围内,这个对象不会被垃圾回收,原因与您提到的相同 - 从映射中删除后仍然有对该对象的引用。

地图的状态是内部的,只有在删除操作后才会从那里移除。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-13
    • 2019-10-22
    • 2019-01-21
    • 2019-01-05
    • 2015-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多