英文:
Allocation: new(Foo) vs Foo{}
问题
以下是创建对象的两种语法的区别以及为什么会有两种不同的方法,尽管结果是相同的。
第一种语法是使用结构体字面量初始化对象:
type Foo struct {
X int
}
f1 := &Foo{}
在这种情况下,我们使用&
操作符创建了一个指向Foo
类型的指针,并将其初始化为空对象。
第二种语法是使用new
关键字创建对象:
f2 := new(Foo)
在这种情况下,我们使用new
关键字创建了一个指向Foo
类型的指针,并将其初始化为空对象。
尽管两种方法都可以创建一个空的Foo
对象,但它们在语义上有一些微妙的区别。
使用结构体字面量初始化对象时,我们可以在初始化时设置字段的初始值。例如,我们可以使用以下方式初始化X
字段的值:
f1 := &Foo{
X: 10,
}
而使用new
关键字创建对象时,所有字段都将被初始化为其类型的零值。在上面的例子中,f2
的X
字段将被初始化为0
。
因此,尽管两种方法都可以创建相同的对象,但使用结构体字面量初始化对象可以更方便地设置字段的初始值。
英文:
What is the difference between the following syntaxes for creating an object? Why 2 different methods if result is the same?
type Foo struct {
X int
}
f1 := &Foo{}
f2 := new(Foo)
答案1
得分: 10
使用new
是直接返回本地类型(int
、float64
、uint32
等)的指针的唯一方法,而不需要先创建一个普通变量,然后返回指向它的指针。
关于这个问题在以下链接中有更详细的讨论:https://groups.google.com/forum/#!topic/golang-nuts/K3Ys8qpml2Y 和 https://groups.google.com/forum/#!topic/golang-nuts/GDXFDJgKKSs,但基本上它是无用的。
Dave Cheney的引述如下:
> new
不会消失,它不能消失,它是Go 1的规范的一部分。
>
> 你不需要使用它,大多数人都不使用,但这并不意味着它没有用处。
英文:
Using new
is the only way to directly return a pointer of a native type (int
, float64
, uint32
, ...) without creating a normal variable first then returning a pointer to it.
There's a longer discussion about it on https://groups.google.com/forum/#!topic/golang-nuts/K3Ys8qpml2Y and https://groups.google.com/forum/#!topic/golang-nuts/GDXFDJgKKSs, but basically it's useless.
Quote by Dave Cheney:
> new isn't going away, it can't, it's part of the guaranteed
> specification for Go 1.
>
> You don't need to use it, most people don't, but that doesn't mean it
> doesn't have a use.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论