new和make的区别
目录
在Go语言中,new
和 make
是两个用于分配内存的关键字,它们的作用有所不同。
new
new
用于创建一个指向新分配的零值的指针,返回的是指针。对于指针、引用类型(slice、map 和 channel),new
返回的是指针。new
分配内存,但不对内存进行初始化,返回指针。- 主要用于初始化值类型(比如 struct)的内存空间。
示例:
|
|
make
make
仅用于创建 slice、map 和 channel,并返回一个被初始化的(非零值)的引用(非指针)。make
只能用于特定的引用类型(slice、map 和 channel),不能用于其他类型。make
分配内存并且初始化,返回引用。
示例:
|
|
总结:
- make 只能用来分配及初始化类型为 slice、map、chan 的数据;new 可以分配任意类型的数据。
- new 分配返回的是指针,即类型 *Type;make 返回引用,即 Type。
- new 分配的空间被清零;make 分配空间后,会进行初始化。
切片中二者的区别
在 Go 语言中,new
和 make
都是用于分配内存,但是它们分别用于不同的数据类型。对于切片(slice)而言,它们之间的区别主要在于以下几点:
-
make([]T, len, cap)
:make
用于创建切片、映射和通道。- 第一个参数是要创建的数据类型,这里是
[]T
表示切片。 - 第二个参数是切片的长度,表示切片中初始的元素数量。
- 第三个参数是切片的容量,表示从切片的起始位置到底层数组的结束位置之间的元素数量。
- 它返回一个指定类型、长度和容量的切片,并分配了对应类型的内存。这样得到的切片可以直接使用,而且长度和容量都已经指定。
-
new([]T)
:new
用于分配内存,并返回一个指向该类型零值的指针。- 参数是要分配内存的类型,这里是
[]T
表示切片类型。 - 它返回一个指向新分配的类型零值的指针,对于切片来说,这个零值是
nil
切片。 - 此时虽然已经分配了内存,但是还没有初始化切片的长度和容量。这意味着,返回的切片是一个空切片,还不能直接用于存储数据。需要使用
append()
函数来添加元素,或者通过赋值语句将其指向一个已经初始化的切片。
总的来说,make([]T, len, cap)
用于创建一个指定长度和容量的切片,并且分配了对应的内存,可以直接使用;而 new([]T)
只是分配了一个指向 nil
切片的指针,需要进一步初始化后才能使用。