- new(T) 为每个新的类型T分配一片内存,初始化为 0 并且返回类型为
*T
的内存地址:这种方法 返回一个指向类型为 T,值为 0 的地址的指针,它适用于值类型如数组和结构体;它相当于&T{}
。 - make(T) 返回一个类型为 T 的初始值,它只适用于3种内建的引用类型:切片、map 和 channel
在上图中:
var p *[]int = new([]int) // *p == nil; with len and cap 0
p := new([]int)
在第二幅图中, p := make([]int, 0) ,切片 已经被初始化,但是指向一个空的数组。
以上两种方式实用性都不高。下面的方法:
var v []int = make([]int, 10, 50)
或者
v := make([]int, 10, 50)
这样分配一个有 50 个 int 值的数组,并且创建了一个长度为 10,容量为 50 的 切片 v,该 切片 指向数组的前 10 个元素。
如何理解new、make、slice、map、channel的关系?
-
slice、map以及channel都是golang内建的一种引用类型,三者在内存中存在多个组成部分, 需要对内存组成部分初始化后才能使用,而make就是对三者进行初始化的一种操作方式
-
new 获取的是存储指定变量内存地址的一个变量,对于变量内部结构并不会执行相应的初始化操作, 所以slice、map、channel需要make进行初始化并获取对应的内存地址,而非new简单的获取内存地址