在 Go 语言中,new 和 make 是两个用于创建数据结构的关键字,它们之间有一些重要的区别:
适用的数据类型:
new用于创建指针类型,它分配内存并返回指向该内存的指针。make用于创建 slice、map 和 channel 这三种引用类型,它返回初始化后的(非指针的)值。
内存分配方式:
new(T)分配 T 类型大小的内存空间,并返回指向该内存的指针*T。make(T, args)则会根据 T 的类型执行不同的初始化操作。对于 slice,它会分配内存并初始化;对于 map,它会分配并初始化内部数据结构;对于 channel,它会创建一个 unbuffered 或 buffered 的通道。
返回值类型:
new(T)返回一个指向新分配的 T 类型零值的指针*T。make(T, args)返回的是初始化后的 T 类型的值,而非指针。
举例说明:
// 使用 new 创建指针类型
p := new(int)
*p = 42 // 给指针指向的值赋值
// 使用 make 创建 slice、map 和 channel
s := make([]int, 0, 10) // 创建一个初始容量为 10 的 slice
m := make(map[string]int) // 创建一个 map
c := make(chan int, 100) // 创建一个容量为 100 的 channel
总的来说,new 适用于创建基本类型的指针,而 make 适用于创建 slice、map 和 channel 这三种引用类型。new 返回指针,make 返回初始化后的值。合理选择使用 new 还是 make 可以让您的代码更加优雅和高效。