但凡我们比较两个函数的区别,都是从三个方面进行比较:函数参数,返回值及适用范围。
1. new
- 函数原型
- func new(Type) *Type
- 函数参数
- 任意类型,包括我们自定义的类型
- 返回值
- 返回指向新分配类型零值的指针,因为对于不同的数据类型,零值的意义是完全不一样的。比如,对于bool类型,零值为false;int的零值为0;string的零值是空字符串
- 适用范围
- 可用于分配指向任意类型的指针。
2. make
- 函数原型
- func make(t Type, size ...IntegerType) Type
- 函数参数
- Type,和new的参数一样,表示数据类型。不一样的是make的类型只能是:slice, map, chan.
- size参数,指的是切片大小。make还可以指定切片容量
- 常见用法
- 一个参数
- make(map[int]int)
- make(chan int)
- 两个参数,指定类型和大小
- make([]int, size),默认容量和size大小相同
- 三个参数,指定类型,大小和容量
- make([]int, size, capicity)
- 一个参数
- 返回值
- 返回类型的引用而不是指针
- 适用范围
- make只能为slice,map,chan分配内存
- make的扩容机制
- 当有预留的未使用的空间时,直接对未使用的空间进行切片追加,当预留的空间全部使用完毕的时候,扩容的空间将会是当前的slice长度的一倍。
- 扩充的容量也不总是一倍,当扩容的容量较大时,golang会适当缩小每次扩容的容量。具体扩容机制有兴趣的同学可以测试下。