在Go中,如果我想创建一个T的对象,我可以尝试这些方法:
t := T{}
// t是在当前堆栈中创建的实际对象
p := &T{}
// p是指向在当前堆栈中创建的实际对象的指针
p := make(T)
// p是指向在堆中创建的实际对象的指针
p := new(T)
// p是指向在堆
我想知道我的评论是否正确?
答案 0 :(得分:7)
答案 1 :(得分:3)
t := T{} // t is the actual object created in the current stack
p := &T{} // p is a pointer points to the actual object which is created in the current stack
p := make(T) // p is a pointer points to the actual object which is created in the heap
p := new(T) // p is a pointer points to the actual object which is created in the heap
我想知道我的评论是否正确?
不完全是,对象是在堆栈上分配还是堆depends on escape analysis而不是用于实例化对象的特定符号,实际上Dave wrote something about that也是如此。
答案 2 :(得分:1)
查看结果的类型是有益的。
make(T, ...)
会返回T
类型。 make
只能用于少数内置类型(切片,地图,通道)。它基本上是这些类型的“构造函数”。new(T)
会返回*T
类型。它适用于所有类型,并为所有类型执行相同的操作 - 它返回指向类型为T
的新实例的指针,其值为零。