Golang的make与new的区别
创建对象类型不同
make用于内建类型(map、slice 和channel)的内存分配。
new用于各种类型的内存分配。
返回类型不同
new的函数声明:
func new(Type) *Type
接受一个参数,这个参数是一个类型,分配好内存后,返回一个指向该类型内存地址的指针。它同时把分配的内存置为零,也就是类型的零值。
make的函数声明:
func make(t Type, size ...IntegerType) Type
返回的是该类型本身,并且make初始化了内部的数据结构,填充适当的值。make返回初始化后的(非零)值。
make为什么返回非零值
比如slice是个系统定义的结构,有三个字段:一个指针指到数据存储区,长度,存储区容量。只有三个字段都是零值的时候,这个变量才是零值。
比如 make([]int, 0, 0) 创建的slice长度和容量都是0,但是指针不为空,所以不是零值。而且也没有办法直接设置slice所指向的指针,所以make出来的都不是零值。