新闻中心
Golang中new和make的区别是什么_Golang内存分配函数原理解析
new用于分配任意类型的零值内存并返回指针,make仅用于初始化slice、map、channel并返回实例本身,二者用途和返回值不同。

在Go语言中,new 和 make 都是用于内存分配的内置函数,但它们的用途和行为完全不同。理解它们的区别对掌握Go的内存管理机制非常重要。
new 的作用与原理
new(T) 是一个通用的内存分配函数,它为类型
T 分配一块零值的内存空间,并返回指向该类型的指针 *T。
它的主要特点包括:
- 只做内存分配,不初始化复杂结构(如slice、map、channel)
- 分配的空间会被初始化为类型的零值(例如 int 为 0,指针为 nil)
- 适用于任意类型,但返回的是指向零值的指针
例如:
Reachout.ai
一个AI驱动的视频开发平台,专为忙碌的企业家和销售团队打造
142
查看详情
ptr := new(int) *ptr = 10 // ptr 指向一个初始值为 0 的 int,现在被赋值为 10
对于自定义结构体也很常见:
type Person struct {
Name string
Age int
}
p := new(Person)
// p 指向一个字段都为零值的 Person 实例
make 的作用与原理
make(T, args...) 并不分配对象本身,而是用于初始化 slice、map 和 channel 这三种引用类型,并返回类型 T 本身(不是指针)。
它的核心功能是:
- 仅能用于 slice、map、channel
- 完成内部数据结构的初始化(如底层数组、哈希表、缓冲队列等)
- 返回的是类型实例,而不是指针
例如:
slice := make([]int, 5) // 创建长度为5的切片 m := make(map[string]int) // 创建空的 map ch := make(chan int, 10) // 创建带缓冲的 channel
如果尝试用 make 初始化其他类型,比如结构体或基本类型,编译器会报错。
关键区别总结
- 目标类型不同:new 可用于任意类型;make 只能用于 slice、map、channel
- 返回值不同:new 返回指针 *T;make 返回类型 T 本身
- 初始化程度不同:new 只分配并清零;make 会构造运行时所需的数据结构
- 使用场景不同:new 常用于需要显式指针的地方;make 是使用引用类型的必要步骤
举个对比例子:
var p *[]int = new([]int) // p 是指向 slice 的指针,slice 本身为空 s := make([]int, 5) // s 是长度为5的 slice,已准备就绪可用
此时 *p 是一个零值 slice(nil),而 s 已经可以正常使用下标赋值。
底层实现简析
从运行时角度看,new 调用的是 Go 的内存分配器(mallocgc),分配指定大小的堆内存并清零。它本质上是一个泛型的内存申请函数。
make 在编译期间会被转换成特定的运行时函数调用:
- make([]T, len) → runtime.makeslice
- make(map[K]V) → runtime.makemap
- make(chan T) → runtime.makechan
这些函数不仅分配内存,还设置类型信息、初始化哈希表、创建锁结构等,确保类型可正常工作。
基本上就这些。new 和 make 看似相似,实则职责分明:new 是通用内存分配器,make 是引用类型的初始化工具。正确使用它们,是写出高效、安全Go代码的基础。
以上就是Golang中new和make的区别是什么_Golang内存分配函数原理解析的详细内容,更多请关注其它相关文章!
# 内存管理
# 什么网站适合做优化
# 集成灶营销推广预算方
# 咖啡的seo和sem
# 婚庆网站建设价格
# 汉中营销推广厂家电话
# 海口网站品牌建设
# 桂平网站seo优化培训
# 营销推广营销活动多少钱
# 广州站外seo优化价格
# 宁阳网站建设价格
# 适用于
# 清零
# go
# 长度为
# 都是
# 返回值
# 值为
# 数据结构
# 是一个
# 的是
# 区别
# 工具
# go语言
# golang
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
如何在复杂的电商平台中优雅地管理共享资源并确保正确重定向,使用spryker-shop/resource-share-page模块助你一臂之力
Go语言中Map存储的结构体如何调用指针方法:深入解析与实践
Golang如何测试channel通信行为_Golang channel通信测试与分析方法
消息称三星明年 2 月正式发布 HBM4,与 SK 海力士同台竞技
C++的std::mdspan是什么_C++23中用于操作多维数组的非拥有视图
俄罗斯Yandex免登录入口_Yandex搜索引擎官网一键直达
钉钉视频会议画面卡顿如何解决 钉钉会议画面优化方法
sublime侧边栏怎么增强功能_SideBarEnhancements for sublime安装与配置
c++中的std::launder有什么实际用途_c++对象生命周期与指针优化
处理Kafka消费者会话超时:深入理解消息处理语义与幂等性
sublime如何只显示或隐藏特定类型文件_sublime侧边栏文件过滤
如何修改开机登录密码_Windows账户安全设置超详细教程【必学】
我的世界官方游戏入口 我的世界官网平台直达链接
PDF文件体积过大处理_PDF压缩技巧详解
12306选座怎么选到特殊座位_12306特殊座位选择注意事项
单12V-2×6实现为RTX 5090供电750W!甚至都没敢跑分
《噬血代码2》新预告片发布 展示游戏剧情
QQ邮箱网页版邮箱入口 QQ邮箱官方登录平台
内存检查:在VS Code中调试C++时的内存视图
多闪网页版在线观看免费入口_多闪官网访问入口
ACG动漫手机版官网入口 手机ACG动漫APP在线观看正版
台积电1.4nm工艺A14瞄准2028:10年来性能提升80%
抖音网页版企业服务中心登录入口_抖音网页版企业登录平台
HTML元素状态管理:根据DIV内容动态启用/禁用按钮
必由学官网首页入口 必由学教师网页版登录指南
c++20的std::jthread是什么_c++可中断线程与RAII式管理
lar*el怎么安全地存储和获取配置文件中的敏感信息_lar*el敏感信息安全存储方法
J*aScript打印功能_j*ascript输出控制
在WordPress中通过REST API获取BasicAuth保护的远程文章
PySpark中高效提取字符串右侧可变长度数字:使用regexp_extract
优化Django表单:提交验证失败后保留用户输入
AI泡沫首次被“刺破”:GPU十年都无法存活!
移动端XML文件怎么转换成Excel 手机和平板上的解决方案
Lar*el 8 多关键词数据库搜索优化实践
抖音网页版怎么|直播|_抖音网页版开播操作指南
PrimeNG Sidebar背景色自定义指南:CSS覆盖与主题化实践
AWS EC2实例间SQL Server连接超时:安全组配置与故障排除指南
c++如何使用Catch2编写单元测试_c++简洁易用的BDD风格测试框架
Win10怎么设置静态IP地址 Win10手动配置IP地址步骤【指南】
支付宝如何设置安全保护_支付宝安全设置的全面教程
漫蛙manwa官网登录界面_漫蛙漫画网页版主站入口
Django AJAX 文件上传教程:解决图片无法保存到模型的常见问题
Win10如何清理注册表垃圾 Win10注册表维护与优化指南【慎用】
修复二维数组索引越界异常:一维循环到二维坐标的正确映射
谷歌浏览器最新官方入口链接 谷歌浏览器网页版官网导航
黑猫投诉统一入口官网 消费者权益保护投诉平台
怎样使用“本地安全策略”提升Windows安全性_Secpol.msc配置指南【高手】
sublime如何处理大型CSV文件的列对齐_sublime高级表格编辑插件指南
PHP中获取MongoDB服务器运行时间(Uptime)的专业指南
J*aScript设计模式实践_j*ascript代码优化


2025-11-14
浏览次数:次
返回列表