1、适用范围:make 只能创建类型(slice map channel), new可以对所有类型进行内存分配
2、返回值: new 返回指针, make 返回引用
new返回一个指向已清零内存的指针,而make返回一个复杂的结构。
make返回复杂的结构为slice时:它是一个包含3个域的结构体:指向slice中第一个元素的指针,slice的长度,以及slice的容量
3、填充值: new 填充零值, make 填充非零值
new(T)会为T类型的新项目,但new它并不初始化内存,只是将其置零
make(T, args)返回一个初始化的(而不是置零),类型为T的值(而不是*T)。之所以有所不同,是因为这三个类型的背后引用了使用前必须初始化的数据结构
例如:
make([]int, 10, 100) 分配一个有100个int的数组,然后创建一个长度为10,容量为100的slice结构,该slice引用包含前10个元素的数组,对应的,new([]int)返回一个指向新分配的,被置零的slice结构体的指针,即指向值为nil的slice的指针
4、直接使用struct{} 来初始化strut时,返回的是一个struct类型的值,而不是指针
type Student struct{
name string
age int
}
func main(){
var s1 *Student = new(Student)
s1.age = 22
s1.name = "tcy"
var s2 Student = Student{age:21,name:"tcy"}
fmt.Println(s1,s2) //&{tcy 22} {tcy 21}
}