在 Go 语言中,make
和new
都用于分配内存,但它们有以下区别:
一、功能不同
make
用于初始化切片(slice)、映射(map)和通道(channel)这三种特定的数据结构,并返回一个初始化后的对象。它不仅分配内存,还会对这些数据结构进行内部的初始化操作,使其处于可用状态。
new
用于分配内存并返回一个指向新分配类型零值的指针。它可以用于任何类型,但主要用于值类型(如结构体)和基本数据类型的内存分配。
二、返回值类型不同
make
返回的是初始化后的特定数据结构本身,而不是指针。例如,make([]int, 5)
返回一个长度为 5 的切片,而不是指向切片的指针。
new
返回的是指向新分配类型零值的指针。例如,new(int)
返回一个指向整数类型零值的指针。
三、适用场景不同
make
适用于切片、映射和通道的初始化,因为这些数据结构需要特定的内部初始化操作才能正常使用。例如,如果你要创建一个切片来存储一系列整数,使用make([]int, length, capacity)
可以确保切片有正确的长度和容量,并初始化为整数类型的零值。
new
适用于需要分配内存并返回一个指向新分配对象的指针的场景。例如,当你要创建一个结构体实例并在多个地方传递其指针时,可以使用new(StructType)
来分配内存并获得一个指向新结构体的指针。
四、初始化程度不同
make
会对特定的数据结构进行完整的初始化,包括设置长度、容量(对于切片和通道)、内部的哈希表(对于映射)等,使其可以立即使用。
new
仅仅分配内存并将对象初始化为对应类型的零值。对于结构体等复合类型,其内部的字段可能还需要进一步的初始化才能正常使用。
例如:
go 代码解读复制代码package main
import "fmt"
type Person struct {
Name string
Age int
}
func main() {
// 使用 make 创建一个切片
s := make([]int, 5)
fmt.Println(s)
// 使用 make 创建一个映射
m := make(map[string]int)
fmt.Println(m)
// 使用 make 创建一个通道
c := make(chan int)
fmt.Println(c)
// 使用 new 创建一个结构体指针
p := new(Person)
fmt.Println(p)
}
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。