
Go 语言中 new 和 make 的选择:内存分配与初始化详解
如上所述,Go 语言提供了多种内存分配和值初始化的方式,包括 &T{…}、&someLocalVar、new 和 make。理解 new 和 make 的区别,有助于更有效地利用 Go 语言的特性。
new 的使用
new 函数用于分配指定类型的新空间,并将其初始化为零值。它返回的是指向该类型零值的指针。例如:
package mainimport "fmt"type Point struct { X, Y int}func main() { p := new(Point) fmt.Println(p) // Output: &{0 0} i := new(int) fmt.Println(*i) // Output: 0}
在上面的例子中,new(Point) 分配了一个 Point 类型的内存空间,并将其 X 和 Y 字段初始化为零值。new(int) 则分配了一个 int 类型的内存空间,并将其初始化为 0。
需要注意的是,new 只能分配基本类型和结构体的内存,不能用于分配切片、映射和通道的内存。尝试对 int 类型使用取地址符 & 是非法的,例如 &int。
make 的使用
make 函数专门用于创建切片、映射和通道。与 new 不同,make 返回的是这些类型的实例,而不是指针。例如:
package mainimport "fmt"func main() { // 创建一个长度为 0,容量为 10 的 int 类型切片 s := make([]int, 0, 10) fmt.Println(s) // Output: [] // 创建一个空的 string 类型的映射 m := make(map[string]string) fmt.Println(m) // Output: map[] // 创建一个 int 类型的通道 c := make(chan int) fmt.Println(c) // Output: 0x... (通道的地址) close(c) // 关闭通道,防止资源泄露}
在上面的例子中,make([]int, 0, 10) 创建了一个长度为 0,容量为 10 的 int 类型切片。make(map[string]string) 创建了一个空的 string 类型的映射。make(chan int) 创建了一个 int 类型的通道。
new 和 make 的区别总结
作用分配内存,初始化为零值,返回指针创建切片、映射、通道,返回实例类型基本类型、结构体切片、映射、通道返回值指针实例
为什么 Go 语言需要 new 和 make?
理论上,可以将 new 和 make 合并为一个内置函数,例如 NEW,但这样做可能会导致更多的混淆。例如:
// 假设存在一个名为 NEW 的函数// p := NEW(*chan int) // * 是必须的// c := NEW(chan int)// new(int) --> NEW(*int)// new(Point) --> NEW(*Point)// new(chan int) --> NEW(*chan int)// make([]int, 10) --> NEW([]int, 10)// make(Point) // 非法// make(int) // 非法
如果只有一个 NEW 函数,则需要使用 * 来区分指针类型,这可能会增加新手的学习成本。因此,Go 语言选择保留 new 和 make 两个独立的内置函数,以提供更清晰和易于理解的内存分配和初始化方式。
注意事项
在使用 make 创建通道后,记得在使用完毕后关闭通道,以防止资源泄露。使用 close(channel) 关闭通道。new 返回的是指针,需要使用 * 来访问指针指向的值。make 返回的是实例,可以直接使用。
总而言之,new 用于基本类型和结构体的内存分配和零值初始化,返回指针;make 专门用于切片、映射和通道的创建,返回实例。理解它们的区别和使用场景,可以帮助你编写更高效、更易于维护的 Go 代码。
以上就是Go 语言中 new 和 make 的选择:内存分配与初始化详解的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1400606.html
微信扫一扫
支付宝扫一扫