文章目录
- 直接var
- make
- new
- 小结
直接var
func main(){var sli []intfmt.Println(sli) // 打印结果为:[]fmt.Println(len(sli)) // 打印结果为:0fmt.Println(cap(sli)) // 打印结果为:0fmt.Println(sli[0]) // panic: index out of range [0] with length 0
}
此时sli只分配了这个切片结构,还没有分配底层数组,存储元素个数为0
,容量也为0
make
var sli []int = make([]int,2,5)
此时make
不仅会为sli分配这个切片结构,还会开辟一段内存作为sli的底层数组,并将底层数组的值初始化为整型的默认值0
向sli中新增一个元素3
var sli []int = make([]int,2,5)
sli = append(sli,3)
注意:make只能用来为slice、map、channel类型分配内存和初始化一个对象
new
func main(){sli := new([]int)fmt.Println(*sli) // 打印为:[]fmt.Println(len(*sli)) // 打印为:0fmt.Println(cap(*sli)) // 打印为:0fmt.Println((*sli)[0]) // panic: index out of range [0] with length 0
}
此时new
会为sli指向一个没有分配底层数组的切片结构,存储元素个数和容量都为0
小结
- make既分配内存,也初始化内存。new只是将内存清0,并没有初始化内存
- make返回的是引用类型本身。new返回的是指向类型的指针
- make只能用来分配及初始化slice、map、channel。new可以分配任意类型的数据