Go (惯用?)新(T)和&;T{…}?

Go (惯用?)新(T)和&;T{…}?,go,Go,我开始拿围棋开玩笑,对新的功能有点恼火。它似乎相当有限,特别是在考虑具有匿名字段或内联初始化的结构时。因此,我通读了规范,并: 调用内置函数new或获取复合文字的地址会在运行时为变量分配存储 所以我怀疑new(T)和&T{}会以完全相同的方式运行,对吗?如果这是正确的,在什么情况下应该使用新的?是的,你是正确的新建对于结构没有多大用处。但它与其他基本类型有关new(int)将获得指向零值int的指针,您不能执行&int{}或类似操作 在任何情况下,根据我的经验,您很少希望这样做,因此很少使用ne

我开始拿围棋开玩笑,对新的
功能有点恼火。它似乎相当有限,特别是在考虑具有匿名字段或内联初始化的结构时。因此,我通读了规范,并:

调用内置函数new或获取复合文字的地址会在运行时为变量分配存储


所以我怀疑
new(T)
&T{}
会以完全相同的方式运行,对吗?如果这是正确的,在什么情况下应该使用
新的

是的,你是正确的<代码>新建
对于结构没有多大用处。但它与其他基本类型有关
new(int)
将获得指向零值
int
的指针,您不能执行
&int{}
或类似操作


在任何情况下,根据我的经验,您很少希望这样做,因此很少使用
new
。您只需声明一个普通的
int
并传递指向它的指针。事实上,这样做可能更好,因为编译器会为您做出决定,这样可以让您不再考虑在堆栈中分配还是在堆中分配。

我必须承认,模糊堆和堆栈分配之间的界限是避免显式调用
new
的一个很好的理由。但是,看到像<代码>返回(和MyStult{}})< /C> >仍然会使我的C++容纳的脊椎颤抖。即使你使用<代码>新< /C>,编译器也可以决定如果你的变量不想从当前函数中“逃离”,那么在你的函数栈上把变量放在堆栈上会更有效。这进一步模糊了堆/堆栈的区别。堆栈很好使用,因为不需要垃圾收集。