go中make、new和直接var的区别

直接var

func main(){
          
   
	var sli []int
	fmt.Println(sli)					// 打印结果为:[]
	fmt.Println(len(sli))				// 打印结果为:0
	fmt.Println(cap(sli))				// 打印结果为:0
	fmt.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))		// 打印为:0
	fmt.Println(cap(*sli))		// 打印为:0
	fmt.Println((*sli)[0])		// panic: index out of range [0] with length 0
}

此时new会为sli指向一个没有分配底层数组的切片结构,存储元素个数和容量都为0

小结

  1. make既分配内存,也初始化内存。new只是将内存清0,并没有初始化内存
  2. make返回的是引用类型本身。new返回的是指向类型的指针
  3. make只能用来分配及初始化slice、map、channel。new可以分配任意类型的数据
经验分享 程序员 微信小程序 职场和发展