当前位置: > > > > t=&T{} 和 t=new(T) 之间的核心区别是什么
来源:stackoverflow
2024-04-21 14:24:36
0浏览
收藏
今日不肯埋头,明日何以抬头!每日一句努力自己的话哈哈~哈喽,今天我将给大家带来一篇《t=&T{} 和 t=new(T) 之间的核心区别是什么》,主要内容是讲解等等,感兴趣的朋友可以收藏或者有更好的建议在评论提出,我都会认真看的!大家一起进步,一起学习!
问题内容
似乎这两种创建成员值全部为“0”的新对象指针的方法,都返回一个指针:
type T struct{} ... t1:=&T{} t2:=new(T)
那么 t1 和 t2 之间的核心区别是什么,或者有什么是“new”可以做而 &t{} 不能做的,或者反之亦然?
解决方案
[…] 有什么事情是“new”可以做而 &t{} 不能做的,或者反之亦然?
我可以想到三个区别:
- “复合文字”语法(
&t{}
的t{}
部分)仅适用于“结构体、数组、切片和映射”[],而new
函数适用于任何类型 [] . - 对于结构体或数组类型,
new
函数始终为其元素生成零值,而复合文字语法可让您根据需要将某些元素初始化为非零值。 - 对于切片或映射类型,
new
函数始终返回指向nil
的指针,而复合文字语法始终返回初始化的切片或映射。 (对于映射而言,这一点非常重要,因为您无法向nil
添加元素。)此外,复合文字语法甚至可以创建非空切片或映射。
(第二个和第三个要点实际上是同一件事的两个方面 – new
函数始终创建零值 – 但我单独列出它们,因为不同类型的含义有点不同。)
对于结构体和其他复合体,两者是相同的。
t1:=&t{} t2:=new(t) //both are same
如果不使用 new
,则无法返回初始化为 int 等其他基本类型零值的未命名变量的地址。您需要创建一个命名变量,然后获取其地址。
func newint() *int { return new(int) }
func newInt() *int { // return &int{} --> invalid var dummy int return &dummy }
以上就是《t=&T{} 和 t=new(T) 之间的核心区别是什么》的详细内容,更多关于的资料请关注公众号!