登录
首页 >  Golang >  Go问答

外部引用会阻止垃圾回收结构内字段吗?

来源:stackoverflow

时间:2024-03-22 21:00:30 372浏览 收藏

在 Go 中,外部引用是否会阻止垃圾回收结构内字段取决于如何传递结构。如果按值传递,结构可以被垃圾回收,而返回的指针指向副本。但是,如果按引用传递,结构将不可收集,因为存在对其的引用。即使返回指向结构副本的指针,结构本身仍可以被垃圾回收,但指针本身不能。

问题内容

例如,如果我有一些 type A struct { B string; C int },我有一个 func foo(a A) *string { return &a.B },我用 c := foo(a) 调用它,A 是否必须保留在上下文中,直到 c 可收集?

或者,如果我定义 func foo1(a A) *string { s := a.B; return &s } 这会对 A 何时被收集有影响吗?


解决方案


在第一个示例中,假设在调用 foo(a) 后未使用 a,则 a 是可收集的,因为您按值传递了 a。该函数返回一个指向 a 副本中的值的指针,因此 a 变得可收集,但在函数 foo 中创建的副本不可收集。

现在,如果您将 &a 传递给 foo(a *A),则 a 将不可收集,因为 c 是指向它的指针。

您给出的第二个示例还传递了 a 的副本,因此适用相同的参数。但是,如果您传递了 &a,然后返回一个指向 a 中的字符串副本的指针,则 a 将是可收集的,但不是您返回的字符串,因为存在对它的引用。

今天关于《外部引用会阻止垃圾回收结构内字段吗?》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>