make和new实际上做了什么?

时间:2014-09-09 10:18:59

标签: go

在Go中,如果我想创建一个T的对象,我可以尝试这些方法:

t := T{} // t是在当前堆栈中创建的实际对象
p := &T{} // p是指向在当前堆栈中创建的实际对象的指针 p := make(T) // p是指向在堆中创建的实际对象的指针 p := new(T) // p是指向在堆

中创建的实际对象的指针

我想知道我的评论是否正确?

3 个答案:

答案 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的新实例的指针,其值为零。