一、&T{…}

&T{...} 可以返回一个 T 类型指针,并且在括号指定初值,只能用于结构体

二、new(T)

new(T)&T{...}基本相同,但不能指定初值(所以一般还是用new(T)),不过除了结构体还可以用于基本类型(如 int )

三、make(T)

make(T)用于创建 3 种内建的引用类型:切片、map 和 channel,如:

1
v := make([]int, 10, 50)

这样分配一个有 50 个 int 值的数组,并且创建了一个长度为 10,容量为 50 的 切片 v,该 切片 指向数组的前 10 个元素

换言之,new 函数分配内存,make 函数初始化;下图给出了区别:

又或者,我们来看 buildin.go 中的注释: