在Go中使用new vs var

9 pointers go

你有一个带参数的函数,一个指向类型的指针.

type bar struct{...}

func foo(arg *bar)
Run Code Online (Sandbox Code Playgroud)

之间有什么区别:

var b bar
foo(&b)
Run Code Online (Sandbox Code Playgroud)

b := new(bar)
foo(b)
Run Code Online (Sandbox Code Playgroud)

使用new会创建一个分配.

Den*_*ret 12

不,没有区别,因为,与C相反,Go明确指出您可以指定本地创建的变量.

文档:

请注意,与C不同,返回局部变量的地址是完全可以的.与函数关联的存储在函数返回后仍然存在


Von*_*onC 5

两者都应该表示指向使用相同默认值初始化的相同对象的相同指针。

规范确实提到:

type T struct { i int; f float64; next *T }
t := new(T)
Run Code Online (Sandbox Code Playgroud)

以下内容成立:

t.i == 0
t.f == 0.0
t.next == nil
Run Code Online (Sandbox Code Playgroud)

之后也是如此

var t T
Run Code Online (Sandbox Code Playgroud)

还:

获取复合文字的地址(§地址运算符)会生成一个指向文字值的唯一实例的指针。

var pointer *Point3D = &Point3D{y: 1000}
Run Code Online (Sandbox Code Playgroud)