复制对指针或值的引用

Hid*_*iAI 7 go

我想我从这里理解答案,但为了以防万一,我想明确询问以下内容(如果您认为这是同一个问题,我表示道歉,但对我而言,对于这些问题感到不同):

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'在应用程序的生命周期?

参考:https://play.golang.org/p/JWNf5yRd_B

Agi*_*gis 10

没有比官方文档更好的地方了:

func NewFile(fd int, name string) *File {
    if fd < 0 {
        return nil
    }
    f := File{fd, name, nil, 0}
    return &f
}
Run Code Online (Sandbox Code Playgroud)

请注意,与C不同,返回局部变量的地址是完全可以的.与函数关联的存储在函数返回后仍然存在.实际上,获取复合文字的地址在每次评估时都会分配一个新实例,因此我们可以将这两行结合起来.

(来源:"有效去")

因此第一个选项(返回指向局部变量的指针)绝对安全,甚至鼓励.通过执行转义分析,编译器可以告诉变量转义其本地作用域并将其分配给堆.