首页 > 解决方案 > t=&T{} 和 t=new(T) 的核心区别是什么

问题描述

似乎使用所有“0”成员值创建新对象指针的两种方法都返回一个指针:

type T struct{}
...
t1:=&T{}
t2:=new(T)

那么 t1 和 t2 之间的核心区别是什么,或者有什么“新”可以做而 &T{} 不能做的事情,反之亦然?

标签: pointersgostructnew-operator

解决方案


[...] 有什么“新”可以做而 &T{} 不能做的事情,反之亦然?

我能想到三个不同点:

  • “复合文字”语法(的T{}一部分&T{})仅适用于“结构、数组、切片和映射”[链接],而该new函数适用于任何类型[链接]。
  • 对于结构或数组类型,new函数总是为其元素生成零值,而复合文字语法允许您根据需要将一些元素初始化为非零值。
  • 对于切片或映射类型,new函数始终返回指向 的指针nil,而复合文字语法始终返回已初始化的切片或映射。(对于地图来说,这非常重要,因为您不能向 . 中添加元素nil。)此外,复合字面量语法甚至可以创建空切片或地图。

(第二个和第三个要点实际上是同一件事的两个方面——new函数总是创建零值——但我将它们分开列出,因为不同类型的含义有点不同。)


推荐阅读