golang中经常会用到make来初始化变量, 另外还有new也可以用来定义及初始化变量,这两者有啥区别呢?
new(T)
func new(Type) *Type
new(T)会为T类型的新项目,分配被置零的存储,并且返回它的地址,一个类型为*T的值
1 | p1 := new(int) |
一般情况下, 能够使用new的方式也可以使用下面这种方式,效果是一样的.
new不常用
make(T)
make只能用于初始化slice, map, channel这三种数据类型.
slice 的零值是 nil,使用 make 之后 slice 是一个初始化的 slice,即 slice 的长度、容量、底层指向的 array 都被 make 完成初始化,此时 slice 内容被类型 int 的零值填充,形式是 [0 0 0],map 和 channel 也是类似的
1 | // Slice |
两者区别
主要的区别分为两点:
- 两者都是内建函数
- make的作用是初始化内置的数据结构,只能用于slice, map, channel这3种结构, 返回对应的数据类型
- new只接收一种类型, 根据传入的类型在堆上分配一片内存空间并返回指向这片内存空间的指针
- 在内存上分配上很难说使用两者golang编译器会如何进行分配, 关于内存分配可再深入研究一番.