Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
Go 语言中 new 和 make 的选择:内存分配与初始化详解_创想鸟

Go 语言中 new 和 make 的选择:内存分配与初始化详解

go 语言中 new 和 make 的选择:内存分配与初始化详解

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 的区别总结

特性 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

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Go语言:高效转换二进制字符串为整数的实践指南
上一篇 2025年12月15日 17:09:00
Go WebSocket EOF错误处理与连接管理
下一篇 2025年12月15日 17:09:06

相关推荐

发表回复

登录后才能评论
关注微信