new 和 make 都是 Go 语言中用于内存分配的原语。简单来说,new 只分配内存,make 用于初始化 slice、map 和 channel。

new

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

1
2
3
4
5
func main() {
var v *int //int类型的指针,&v:v的地址,v的值为nil
v = new(int)
*v = 8
}

make

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

区别

  • make 只能用来分配及初始化类型为 slice、map、chan 的数据;new 可以分配任意类型的数据。
  • new分配返回的是指针,即类型*Type,make返回引用,即Type。
  • make分配空间后会进行初始化