Golang为初始化一个变量提供了两个关键字:make和new。其功能是等价的,但是使用场景、实现细节有略微的差别。
- make初始化仅限于slice、map、channel这几个语言内置的结构。
- new初始化是根据传入的类型在堆上分配一片内存空间并返回指向这段空间的指针。
make
make内置函数分配并初始化类型为slice、map或chan的对象。与new一样,第一个参数是类型,而不是值。与new不同,make的返回类型与它的参数类型相同,而不是指向它的指针。
结果的规格取决于类型:
slice:大小指定长度。薄片的容量等于它的长度。可以提供第二个整型参数来指定不同的容量;它必须不小于长度。
例如,make([]int, 0,10)分配一个大小为10的底层数组,并返回由这个底层数组支持的长度为0、容量为10的片。
map:一个空的Map被分配了足够的空间来容纳指定数量的元素。大小可以省略,在这种情况下,分配一个小的初始大小。
channel:通道的缓冲区用指定的缓冲区容量初始化。如果为0,或者省略大小,则通道未缓冲。
new
new内置函数分配内存,第一个参数是类型,而不是值,返回的值是指向该类型新分配的零值的指针。