在Go中,以下两段代码之间存在显着差异:
v := &Vector{}
而不是
v := new(Vector)
答案 0 :(得分:23)
没有。他们返回的是相同的,
package main
import "fmt"
import "reflect"
type Vector struct {
x int
y int
}
func main() {
v := &Vector{}
x := new(Vector)
fmt.Println(reflect.TypeOf(v))
fmt.Println(reflect.TypeOf(x))
}
结果:
*main.Vector
*main.Vector
邮件列表上存在争议,两者都令人困惑:
https://groups.google.com/forum/?fromgroups=#!topic/golang-nuts/GDXFDJgKKSs
有一点需要注意:
new()是获取指针的唯一方法 未命名的整数或其他基本类型。你可以写" p:= new(int)"但 你不能写" p:=& int {0}"。除此之外,它是一个问题 偏好。
来源:https://groups.google.com/d/msg/golang-nuts/793ZF_yeqbk/-zyUAPT-e4IJ
答案 1 :(得分:13)
是的,两个代码片段之间存在根本区别。
v := &Vector{}
仅,Vector
是结构类型,地图类型,数组类型或切片类型
v := new(Vector)
适用于任何类型的Vector
。
答案 2 :(得分:5)
根据Effective Go,new()
是一个分配内存的函数,并将其归零;即每个字段(以及结构的整个内存)将设置为0
s。如果你设计你的结构,那么当它们被创建时,所有字段应该等于零,而不是很好并且建议使用它。但是,如果您需要更多地控制要使用的初始值,则应使用更常规的方法。
在特定情况下,您提到差异是无关紧要的,但应在其他地方注明。
我希望这有帮助! :)
答案 3 :(得分:0)
在此示例中,这两个值都将在堆上分配。 Go与C不同,您可以在其中明确确定内存的分配位置。 Go在编译时执行“转义分析”,如果有必要,将在堆上分配内存。据我所知,如果你引用一个对象的地址,它将被分配在堆上。由于v := &Vector{}
将Vector{}
的地址分配给v
,编译器将决定是否需要在堆上分配。
答案 4 :(得分:0)
这是一个区别:对于Person
结构,&[]*Person{}
编组的JSON字符串为[]
,new([]*Person)
编组的null
使用json.Marshal
}}