他们似乎是一样的:
package main
import "fmt"
type S struct {
i int
}
func main() {
var s1 *S = new(S)
fmt.Println(s1)
var s2 *S = &S{}
fmt.Println(s2) // Prints the same thing.
}
更新
嗯。我刚刚意识到使用new初始化S.i没有明显的方法。有没有办法做到这一点? new(S{i:1})
似乎不起作用:/
答案 0 :(得分:9)
作为一个限制性案例,如果复合文字根本不包含任何字段, 它为该类型创建零值。表达式new(File)和 & File {}是等效的。
答案 1 :(得分:1)
它们不仅会给出相同的结果值,而且如果我们分配两种方式并查看它们的值......
// Adapted from http://tour.golang.org/#30
package main
import "fmt"
type Vertex struct {
X, Y int
}
func main() {
v := &Vertex{}
v2 := new(Vertex)
fmt.Printf("%p %p", v, v2)
}
...我们将看到它们实际上是分配在连续的内存插槽中。典型输出:0x10328100 0x10328108
。我不确定这是实现细节还是规范的一部分,但它确实证明它们都是从同一个池中分配的。
Play around with the code here.
至于使用new初始化,根据the language spec:The built-in function new takes a type T and returns a value of type *T. The memory [pointed to] is initialized as described in the section on initial values.
因为go中的函数不能重载,并且这不是可变函数,所以没有传递任何初始化数据的方法。相反,go将使用适用于类型和任何成员字段的0
版本来初始化它。
答案 2 :(得分:0)
Case 1: package main
import (
"fmt"
)
type Drink struct {
Name string
Flavour string
}
func main() {
a := new(Drink)
a.Name = "Maaza"
a.Flavour = "Mango"
b := a
fmt.Println(&a)
fmt.Println(&b)
b.Name = "Frooti"
fmt.Println(a.Name)
}//This will output Frooti for a.Name, even though the addresses for a and b are different.
Case 2:
package main
import (
"fmt"
)
type Drink struct {
Name string
Flavour string
}
func main() {
a := Drink{
Name: "Maaza",
Flavour: "Mango",
}
b := a
fmt.Println(&a)
fmt.Println(&b)
b.Name = "Froti"
fmt.Println(a.Name)
}//This will output Maaza for a.Name. To get Frooti in this case assign b:=&a.