
先看一下源码中这两个函数的说明
new
1 | // The new built-in function allocates memory. The first argument is a type, |
内置函数new分配内存。
第一个参数是一个类型,而不是值,这个函数会分配一个这个类型的零值,并返回这个零值的指针。
1 | package main |
这两种创建变量的方式作用是相同的。
make
1 | // The make built-in function allocates and initializes an object of type |
内置函数make分配并初始化一个slice、map或者chan对象(只支持这三种)。
与new函数相似,第一个参数是一个类型,而不是值。
与new不同的是,make函数的返回值的类型与它的参数指定的类型相同,而不是指向这个类型的指针。
其返回值依赖于具体传入的类型:
slice:size指定切片的长度。第二个int参数可以指定切片长度。第三个参数指定切片容量,这个值必须不小于长度。map:根据size指定的数量来分配足够的空间容纳元素的空map。忽略size参数则会默认分配一个较小的初始长度的map。channel:通道的缓冲区通过指定的缓冲区容量来初始化。如果size参数值为 0 或者被省略,则这个通道是没有缓冲区的(简单举例就是写入一个数据就会进入阻塞状态)。
初始化map和channel时,可以忽略size参数
1 | make(map[string]int) |
初始化slice时必须指定长度,容量可以忽略。
1 | make([]int) //错误 |
初始化channel时指定缓冲区容量
1 | make(chan int, 3) |
对于slice和channel均可以使用内置函数len获取长度,使用cap获取容量,而对于map不能使用cap函数。
map是没有大小或长度的限制的。比如初始化一个指定容量的map:
1 | m := make(map[string]int, 1) |
频繁的调整会影响性能,因此当定义一个元素数量的增长趋势比较大的map时。应该大致的预定义一个容量,而不是让它频繁的触发容量调整。