新闻中心

Golang中new和make的区别是什么_Golang内存分配函数原理解析

2025-11-14
浏览次数:
返回列表
new用于分配任意类型的零值内存并返回指针,make仅用于初始化slice、map、channel并返回实例本身,二者用途和返回值不同。

golang中new和make的区别是什么_golang内存分配函数原理解析

在Go语言中,newmake 都是用于内存分配的内置函数,但它们的用途和行为完全不同。理解它们的区别对掌握Go的内存管理机制非常重要。

new 的作用与原理

new(T) 是一个通用的内存分配函数,它为类型 T 分配一块零值的内存空间,并返回指向该类型的指针 *T。

它的主要特点包括:

  • 只做内存分配,不初始化复杂结构(如slice、map、channel)
  • 分配的空间会被初始化为类型的零值(例如 int 为 0,指针为 nil)
  • 适用于任意类型,但返回的是指向零值的指针

例如:

Reachout.ai Reachout.ai

一个AI驱动的视频开发平台,专为忙碌的企业家和销售团队打造

Reachout.ai 142 查看详情 Reachout.ai
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代码优化 

搜索