go语言中make和new有什么作用以及区别?
在Go语言中,make
和 new
是两个内置的函数(built-in functions),用于分配内存,但它们之间有显著的区别,主要体现在它们被用于不同类型的对象分配内存。
new
new
关键字用于分配内存。更确切地说,它分配了零值初始化的内存空间,并返回指向这个新分配类型的指针。它只用于内建的数据类型(如int、float64、struct等),或者任何类型的指针、切片、映射、通道、函数等类型。但是,new 不会为切片、映射或通道初始化内部数据结构,只会分配一个指向这些类型的零值的指针。
new
函数接受一个类型 Type 作为参数,并返回一个指向该类型新分配零值的指针 *Type。
语法如下:
# 完整语法
var ptr *Type = new(Type)
# 简写
ptr := new(Type)
这里的 Type
是一个类型, 变量 ptr
是一个指向该类型零值内存地址的指针。
实际编程中,通常我们会采用简写形式。
举个栗子🌰,如下所示:
var ptr *int = new(int)
// 现在 ptr 指向一个 int 类型的零值0
*ptr = 2
fmt.Println(*ptr) // 输出: 2
也可以简写成
ptr := new(int)
// 现在 ptr 指向一个 int 类型的零值0
*ptr = 2
fmt.Println(*ptr) // 输出: 2
make
make
函数用于初始化内置的数据结构类型:切片(slice)、映射(map)和通道(channel)。它不仅分配了内存,还返回了初始化(非零)后的(内建的)值。
例如,对于切片,它返回了一个长度和容量都已初始化的切片;对于映射,它返回了一个空的映射(准备好接受键值对);
对于通道,它返回了一个可以进行通信的通道。
如下所示
slice := make([]Type, len, cap)
map := make(map[KeyType]ValueType)
channel := make(chan Type, capacity)
- []Type 表示切片的元素类型。
- len 是切片的长度。
- cap 是切片的容量(可选,默认为长度)。
- KeyType 是映射的键的类型。
- ValueType 是映射的值的类型。
- Type 是通道中元素的类型。
- capacity 是通道的容量(可选,对于无缓冲通道,容量为0)。
区别
- 用途:
new
用于分配任意类型的内存空间,并返回指向该空间的指针,它不会初始化内存;make
用于初始化切片、映射、通道等内建的数据结构类型。 - 返回值:
new
返回的是一个指向类型的指针;make
返回的是初始化后的(内建的)值,比如切片、映射或通道。 - 零值:
new
分配的类型被零值初始化;make
初始化的切片、映射和通道则不是零值,它们有特定的初始状态(比如,切片的长度和容量,空的映射,可以通信的通道)。 - 适用类型:
new
适用于所有类型;make
只适用于切片、映射和通道。