在 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
可以让您的代码更加优雅和高效。