go语言中的new与make
初学go语言,对于初始化变量时使用new还是make有些迷惑,这里简单总结一下
new() 和 make() 的区别
以下摘录自 https://github.com/unknwon/the-way-to-go_ZH_CN/blob/master/eBook/07.2.md
二者都在堆上分配内存,但是它们的行为不同,适用于不同的类型。
- new(T) 为每个新的类型T分配一片内存,初始化为 0 并且返回类型为*T的内存地址:这种方法 返回一个指向类型为 T,值为 0 的地址的指针,它适用于值类型如数组和结构体;它相当于
&T{}
。 - make(T) 返回一个类型为 T 的初始值,它只适用于3种内建的引用类型:切片、map 和 channel
换言之,new 函数分配内存,make 函数初始化;下图给出了区别:
我的理解,new
返回一个变量的指针,但是这个指针指向空,你不可以直接对该指针进行操作,否则会报错,除非你将该指针指向一个该类型变量的地址。
make返回一个该类型的变量,以切片变量为例,上面提到,make适用于创建切片、map和channel,但new也可以创建
|
|
输出结果为
|
|
map的初始化
map有以下两种初始化方法
- 使用make函数
- 直接使用map初始化
|
|
slice切片的初始化
同样可以通过make和切片本身进行初始化
|
|
array数组的初始化
数组不能使用make初始化,但是可以使用new初始化
|
|
struct结构体的初始化
结构体不能使用make
,需要使用new
和结构体本身
|
|