对结构中字段的外部引用是否会阻止该结构被垃圾收集?
Does an external reference to a field within a struct prevent that struct from being garbage collected?
例如,如果我有一些 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
的字符串将是可收集的,但不是您返回的字符串,因为有一个对它。
例如,如果我有一些 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
的字符串将是可收集的,但不是您返回的字符串,因为有一个对它。