首页 > 后端开发 > Golang > 正文

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

聖光之護
发布: 2025-08-26 17:46:01
原创
534人浏览过

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

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

如上所述,Go 语言提供了多种内存分配和值初始化的方式,包括 &T{...}、&someLocalVar、new 和 make。理解 new 和 make 的区别,有助于更有效地利用 Go 语言的特性。

new 的使用

new 函数用于分配指定类型的新空间,并将其初始化为零值。它返回的是指向该类型零值的指针。例如:

package main

import "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 返回的是这些类型的实例,而不是指针。例如:

微软文字转语音
微软文字转语音

微软文本转语音,支持选择多种语音风格,可调节语速。

微软文字转语音 0
查看详情 微软文字转语音
package main

import "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 的选择:内存分配与初始化详解的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
热门推荐
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号