Golang new和make (十)|Go主题月

686 阅读2分钟

new和make

我们先来看一个例子:

code-snapshot.png

运行上面的代码会引起panic,为什么呢?

Golang 中使用引用类型的变量,我们不仅要声明它,还需要分配内存空间,否则变量没办法存储我们的赋值。 而值类型变量的声明则不需要分配内存空间,因为在声明时就默认分配内存空间。

由此引出来今天 Golang 中newmake 两个内建函数,它们主要用来分配内存

new

new是 Golang 内置函数,函数结构如下:

func new(Type) *Type

  1. Type表示类型

  2. *Type代表类型指针,new函数返回一个指向该类型内存地址的指针。

new函数不被经常用到,new函数返回一个指向该类型内存地址的指针,指针对应值默认为该类型的零值。举个例子:

code-snapshot (1).png

文章一开始开始代码里 var a *int 声明一个指针变量但没有初始化,指针作为引用类型要初始化后才拥有内存空间。所以按照下面使用内置new函数对a初始化后才可以对其赋值:

code-snapshot (2).png

make

make也是用于内存分配

区别于new,它用于slice、map、chan的内存创建,而且它返回的类型就是这三个类型本身,而不是他们的指针类型,上述三种类型是引用类型,因此返回对应的指针并没有必要。

make函数语法如下:

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

使用slice、map、chan时,Golang 都要用到make函数进行初始化操作。

文章一开始开始代码里 var b map[string]int只声明一个变量 b 是map类型,还需要像下面代码一样使用make函数初始化操作后,才能赋值:

code-snapshot (3).png

new与make的区别

  • newmake 二者都是用来做初始化(内存分配)。引用类型的变量需要声明且初始化,不然不能赋值
  • make (make(map[string]int, 10)) 只用于slicemapchannel的初始化,返回的还是这三个引用类型
  • new (int) 用于类型的内存分配,内存对应的值为零值(false,0,nil),返回的是指向类型的指针