关键字make和new的区别
new
new分配空间,传递给new函数的参数是一个类型,返回值是指向这个新分配的零值的指针
函数原型
func new(Type)*Type
使用new函数为变量分配内存空间
参数:new接收参数type
返回值:返回类型的指针,指针指向分配类型的内存地址
//为默认数据类型分配空间
var num *int
num = new(int)
//为自定义类型分配空间
type Student struct{
name string
age int
}
var stu *Student
stu = new(Student)
make
channel、map、slice类型是引用类型,make用于分配内存,但返回的类型就是这三个类型的引用,而不是指针
函数原型
func make(Type,size_Type)Type
参数:类型、长度
返回值:引用类型
如下栗子:
//只声明但未初始化
var s1 []int
if s1 == nil {
fmt.Printf("s1 is nil \n")
}
//声明并用make函数初始化,指定长度为0
s2 := make([]int, 0)
if s2 ==nil{
fmt.Printf("s2 is nil ---%#v \n",s2)
}else{
fmt.Printf("s2 is not nil ---%#v \n",s2)
}
//声明并用make函数初始化,指定长度为3
s3 := make([]int, 3)
if s3 == nil{
fmt.Printf("s3 is nil ---%#v \n",s3)
}else{
fmt.Printf("s3 is not nil ---%#v\n",s3)
}
对比make和new
var s1 = new(map[int]string)
if *s1 == nil{
fmt.Printf("s1 is nil --- %#v \n",s1)
}
s2 := make(map[int]string)
if s2 == nil{
fmt.Printf("s2 is nil ---%#v \n",s2)
}else{
fmt.Printf("s2 is not nil --- %#v \n",s2)
}
make和new主要区别:
- make只能用来分配及初始化类型为slice、map、channel的数据,即创建它们的数据结构;new可以分配任意类型的数据
- new分配返回的是指针;make返回引用
- new分配的空间被清零;make分配空间后会进行初始化