我正在参加「掘金·启航计划」

Go 语言中的 new 和 make 一直是新手比较容易混淆的东西,也是面试中经常被问的问题。

1、Go语言中的值类型和引用类型
  • 值类型:int、float、bool、string、struct和数组(数组要特别注意);变量直接存储值,分配栈区的内存空间,这些变量所占据的空间在函数被调用完后会自动释放。
  • 引用类型:slice、map、chan和值类型对应的指针;变量存储的是一个地址(指针),指针指向内存中真正存储数据的首地址,内存通常在堆上分配,通过GC回收
2、new()和make()

2.1、new的主要特性

new用来分配内存,他的第一个参数是一个类型,不是一个值,它会申请一个该类型大小的内存空间,并会初始化为对应的零值,返回指向该内存空间的一个指针。

func new(Type) *Type
复制代码

2.2、make的主要特性

make是用来为slice、map或chan类型分配内存和初始化一个对象(只能用在这三种类型),跟new类似,第一个参数也是一个类型而不是一个值,跟new不同的是,make返回类型的引用而不是指针,而返回值也依赖于具体传入的类型。

func make(t Type, size ...IntegerType) Type
复制代码

2.3、二者区别

  • 二者都是用来做内存分配的。
  • make只用于slice、map以及channel的初始化,返回的还是这三个引用类型本身。
  • new用于类型的内存分配,并且内存对应的值为类型零值,返回的是指向类型的指针。