【问题标题】:Does an external reference to a field within a struct prevent that struct from being garbage collected?对结构中字段的外部引用是否会阻止该结构被垃圾收集?
【发布时间】:2020-01-15 12:35:41
【问题描述】:

例如,如果我有一些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 有影响吗?

【问题讨论】:

    标签: go garbage-collection


    【解决方案1】:

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

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

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

    【讨论】:

    • 您对按值传递是正确的;不解决问题本身,因为我觉得这会使您的答案在上下文中不太清楚
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-26
    • 2020-02-11
    • 2015-10-08
    • 2014-03-18
    • 1970-01-01
    相关资源
    最近更新 更多