我想我了解here的答案,但以防万一,我想明确询问以下内容(如果您认为这是同一问题,我深表歉意,但对我来说,在关注点上却有所不同):
func f() *int {
d := 6
pD := new(int)
pD = &d // option 1
*pD = d // option 2
return pD
}
我只是将引用复制为指针的第一个选项是性能方面的,是最佳选择(这是有教育意义的猜测,但似乎很明显)。我更喜欢这种方法/模式。
第二个选项将(浅)复制(?)。我想是因为该方法可以复制,所以我不担心GC扫描'd'实例。由于我的不安全感(或初学者的无知),我经常使用此方法。
我关心的(或更不安全的是)在第一种方法(传输“d”的地址)中,GC是否会识别它(指针变量“d”)被指针容器引用,因此它不会被席卷吗?因此,使用此方法将是安全的吗? IE。我可以在应用程序的生命周期中安全地传递从函数“f()”返回的指针“pD”吗?
引用:https://play.golang.org/p/JWNf5yRd_B
最佳答案
没有比官方文档更好的地方了:
(来源:"Effective Go")
因此,第一种选择(返回指向局部变量的指针)绝对是安全的,甚至是值得鼓励的。通过执行escape analysis,编译器可以告知变量转义其局部作用域,然后将其分配到堆上。