当我们想要在 Go 语言中初始化一个结构时,可能会用到两个不同的关键字 make和new。new和make是内建的两个函数,主要用来创建分配类型内存。因为它们的功能相似,所以有的同学可能会对这两个关键字的作用感到困惑,但是它们两者能够初始化的变量却有较大的不同。

make

make 的作用是初始化内置的数据结构,也就是slice、map和 channel,此时编译器不知道你需要使用多少内存,因为这些数据结构占用的内存是运行时才能知晓的。slice、map、channel 这些类型它是复合类型数据结构,通常是一个结构体+堆内存,因此 make 的额外作用就是初始化这些数据和指针,从这一点看,make 的作用是申请内存,并且初始化数据。

slice := make([]int, 0)
mp := make(map[string]string, 100)
ch := make(chan int, 5)

new

new 的作用是根据传入的类型分配一片内存空间并返回指向这片内存空间的指针,此时编译器知道你需要使用多少内存,用于结构体和类型,其实只要是任何指针都可以new,它只负责申请内存,但是不会初始化。我们平时的用法就是new一个结构体,返回一个对象的引用。这个指针指向的内容的值为零,记住不是指针为零。当我们声明一个指针类型时,一定要new一个,就是为了给这个指针分配内存,不然会报内存地址为空。

type S struct { a int; b float64 }
new(S)

var i *[]int
i = new([]int)

实在不懂可以记住一句话:make 只能用于 map 、slice 、channel ,new 只能用于结构体