返回 Go 中结构成员或嵌入结构的指针?

alp*_*pav 2 struct pointers heap-memory go

在 Go 中,获取地址并返回指向函数内局部变量的指针会导致编译器在堆上而不是堆栈上分配它,因此返回的指针仍然有效。

现在,如果我获取并返回结构成员或嵌入结构的地址,会发生什么?

type A struct {
    a,b,c int
}
type B struct {
    A
    d,e,f int
}
func (b *B) get1() *A {
    return &b.A
}
func (b *B) get2() *A {
    localB := B{}
    return &localB.A
}
Run Code Online (Sandbox Code Playgroud)

编译器会在堆上分配嵌入式结构 A 并将 B 的成员保留在堆栈上吗?

即使 localB.A 引用仍在使用中,垃圾收集器也会收集 localB 吗?

如果通过反射访问嵌入结构,编译器如何确定何时将嵌入结构保留在堆栈或堆上?

Zoy*_*oyd 5

编译器执行逃逸分析以确定变量是否可以在其创建范围之外使用,在这种情况下,必须在堆上分配该变量。如果编译器可以确保这不会发生,它会在堆栈上分配该变量。

\n\n

然而,这是编译器当前的行为,但在规范中没有提及,因此它可能在任何未来版本中发生变化。

\n