英文:
What is the difference between new(T) and &T{}?
问题
在Go语言中,对于给定的结构体类型T,new(T)
和&T{}
有什么区别?
new(T)
和&T{}
都用于创建结构体类型T的实例,但它们的行为略有不同。
new(T)
是一个内置函数,它返回一个指向类型T的零值的指针。换句话说,它会分配内存并将其初始化为T的零值。你可以通过解引用指针来访问和修改结构体的字段。
&T{}
是一种结构体字面量的写法,它返回一个指向类型T的新实例的指针。与new(T)
不同,&T{}
允许你在创建实例时提供初始值。你可以在大括号内指定结构体字段的初始值,这些初始值将被用于初始化相应的字段。这种方式更加灵活,可以在创建实例时直接设置字段的值。
总结起来,new(T)
只会将实例初始化为T的零值,而&T{}
可以在创建实例时提供初始值。
英文:
In Go, given struct type T, what is the difference between new(T)
and &T{}
?
答案1
得分: 9
没有区别。根据《Effective Go》的说法,它们是等价的。
作为一个极端情况,如果一个复合字面量根本不包含任何字段,它将创建该类型的零值。表达式new(File)和&File{}是等价的。
英文:
There is no difference. According to Effective Go, they are equivalent.
> As a limiting case, if a composite literal contains no fields at all, it creates a zero value for the type. The expressions new(File) and &File{} are equivalent.
答案2
得分: 5
扩展@Doug的回答:
两种形式new(T)
和&T{}
是完全等价的:它们都分配一个零值的T并返回指向该分配内存的指针。唯一的区别是,&T{}
不能用于内置类型,比如int
;你只能使用new(int)
。
英文:
Extending @Doug answer:
The two forms new(T)
and &T{}
are completely equivalent: Both allocate a zero T and return a pointer to this allocated memory. The only difference is, that &T{} doesn't work for builtin types like int
; you can only do new(int)
.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论