我正在读一本名为The Go Programming Language的书,在第2章中有关指针的内容如下
函数返回局部变量的地址是完全安全的.例如,在下面的代码中,即使在调用返回之后,由f的这个特定调用创建的局部变量v也将保持存在,并且指针p仍将引用它:
var p = f()
func f() *int {
v := 1
return &v
}
Run Code Online (Sandbox Code Playgroud)
我完全没有得到这个,一个局部变量应该在函数执行后被销毁.是因为可能在堆上分配了v.我知道在C中,如果你使用malloc分配空间,它将不会在函数执行后被销毁,因为它在堆上.
Go不是C.尽管有相似之处,但它更高层次.它利用具有绿色线程调度程序和垃圾收集内存管理器的完整运行时.只要它有实时引用,它就永远不会收集内存.
Go编译器包含一个名为"转义分析"的阶段,它跟踪每个变量以查看它是否"转义"声明它的函数.可以转义的任何值都在堆上分配并由垃圾收集管理; 否则,它(通常)在堆栈上分配.
您可以找到有关该主题的更多信息: