Golang new 和 make 函数
在 Golang 中 new()
函数是另外一种创建变量的方式,内建的 new(T)
函数为一个 T
类型的新项分配了 "零 "存储,并返回其地址,即 *T
类型的值。用 Go 的术语来说,它返回一个指向新分配的 T
类型的零值的指针。
Golang new() 函数
函数语法:func new(Type) *Type
new()
返回的内存是清零的。new()
只返回指向初始化内存的指针。new()
适用于所有的数据类型(除了channel
、map
),并为该类型的变量动态分配空间,将其初始化为该类型的零值并返回一个指针。
语法:
这个语法等同于:
有三种不同的方法来创建一个指向零结构值的指针,每种方法都是等价的:
输出:
使用 new()
创建一个变量和先通过 var
初始化一个变量,然后对这个变量取地址没什么不同,唯一的区别是,通过 new()
函数不需要引入变量名称,所以使用上更加简洁、便利。
Golang make() 函数
函数语法:func make(t Type, size ...IntegerType) Type
,和 new 一样,第一个参数是一个类型,而不是一个值。与 new 不同,make 的返回类型与它的参数类型相同,而不是一个指向它的指针。结果的规格取决于类型。
make()
函数是一种特殊的内置函数,只用于初始化切片、map
和通道。 make
返回 T
(数据类型)类型的值,而不是 *T
。与 new()
函数不同,make()
不会返回一个指针。
make([]int, 10, 20)
: make
创建了切片,并根据默认的数据类型值初始化其内容。
new([20]int)[0:10]
: 它也将创建片断,但返回指向初始化内存的指针。
- 切片:尺寸指定的是长度。分片的容量是等于它的长度。可以提供第二个整数参数来指定不同的容量。指定一个不同的容量;它必须不小于长度。例如,
make([]int, 0, 10)
分配了一个底层数组大小为 10 的底层数组,并返回一个长度为 0、容量为 10 的切片,该切片由底层数组支持。
- map:一个空的 map 被分配了足够的空间来容纳指定数量的元素。大小可以省略,在这种情况下
会分配一个小的起始大小。
make(map[int]bool, 10)
- 通道:通道的缓冲区被初始化为指定的缓冲区容量。如果是零,或者省略了大小,通道就会被没有缓冲区。
make(chan int, 5)
输出:
你也可以使用一个复合字面的初始数据来初始化 map,如下图所示:
推荐阅读:
版权声明: 本文为 InfoQ 作者【宇宙之一粟】的原创文章。
原文链接:【http://xie.infoq.cn/article/61931c579f70cc6f01ea22136】。文章转载请联系作者。
评论