Go语言中,new和make都是用来内存(堆上)分配的原语(allocation primitives),但是:

  • make只用于slice、map以及channel的初始化(非零值);new用于类型的内存分配,并且内存置为零。
  • make返回的是引用类型本身;而new返回的是指向类型的指针。

简单的说,new只分配内存,make用于slice,map,和channel的初始化。

new

func new(Type) *Type

new(T) 函数是一个分配内存的内置函数,为每个类型分配一片内存,并初始化为零值且返回其内存地址。

如果它还不是一个变量,不可以可以直接赋值:

var v *int
*v = 8
fmt.Println(*v)

这样会报如下错误:

panic: runtime error: invalid memory address or nil pointer dereference

正确的做法应该是先分配给v一个指向的变量:

var v *int
// 此时已经分配给了 v 指针一个指向的变量,但是变量为零值
v = new(int)
*v = 8
fmt.Println(*v)

make

func make(t Type, size ...int) Type

make 专门用于创建 chan,map 和 slice 三种类型的内容分配,并且可以初始化它们。make 的返回类型与其参数的类型相同,而不是指向它的指针,因为这三种数据类型本身就是引用类型。

参考:go 中 new 和 make 的区别