我想我从这里理解答案,但为了以防万一,我想明确询问以下内容(如果您认为这是同一个问题,我表示道歉,但对我而言,对于这些问题感到不同):
func f() *int {
d := 6
pD := new(int)
pD = &d // option 1
*pD = d // option 2
return pD
}
Run Code Online (Sandbox Code Playgroud)
我只是将引用复制为指针的第一个选项是性能方面,更优化(这是教育猜测,但似乎很明显).我更喜欢这种方法/模式.
第二种选择是(浅)复制(?).我认为这种方法,因为它复制,我不担心GC扫描'd'的实例.由于我的不安全感(或作为初学者的无知),我经常使用这种方法.
我所担心的(或更多,不安全)是在第一种方法(其中'd'的地址被转移)中,GC会认识到它('d'变量)被指针容器引用,因此它不会被扫除?因此,使用这种方法是安全的吗?即我可以安全地传递从func'f()'返回的指针'pD'在应用程序的生命周期?
Agi*_*gis 10
没有比官方文档更好的地方了:
Run Code Online (Sandbox Code Playgroud)func NewFile(fd int, name string) *File { if fd < 0 { return nil } f := File{fd, name, nil, 0} return &f }请注意,与C不同,返回局部变量的地址是完全可以的.与函数关联的存储在函数返回后仍然存在.实际上,获取复合文字的地址在每次评估时都会分配一个新实例,因此我们可以将这两行结合起来.
(来源:"有效去")
因此第一个选项(返回指向局部变量的指针)绝对安全,甚至鼓励.通过执行转义分析,编译器可以告诉变量转义其本地作用域并将其分配给堆.