新闻中心

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)
  • 适用于任意类型,尤其是结构体和基础类型

例如:

ptr := new(int)
*ptr = 10
fmt.Println(*ptr) // 输出 10

这里 new(int) 分配了一个 int 大小的内存空间,值为 0,返回 *int 类型的指针,之后可以通过解引用赋值。

make 的作用与使用方式

make(T, args...) 专门用于初始化 slice、map 和 channel 三种引用类型。它不仅分配内存,还会进行必要的内部结构初始化,使这些类型可以立即使用。

关键点:

  • 仅支持 slice、map、channel 三种类型
  • 返回的是类型本身,而不是指针
  • 确保返回的对象处于可用状态(如 map 可以直接添加键值对)

示例:

Reachout.ai Reachout.ai

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

Reachout.ai 142 查看详情 Reachout.ai
slice := make([]int, 5)        // 长度为5的切片
m := make(map[string]int)      // 空的 map
ch := make(chan int, 10)       // 缓冲区为10的通道

如果不用 make 而直接声明,比如 var m map[string]int,此时 m 是 nil,不能直接赋值,会 panic。

new 与 make 的核心区别对比

对比项 new make
适用类型 任意类型 仅 slice、map、channel
返回值 *T(指针) T(类型本身)
初始化程度 仅零值 完全可使用的状态
是否能用于 map/slice/channel 分配内存但不可用(如 map 为 nil) 初始化后可直接使用

举个典型错误例子:

var m map[string]int
m["key"] = 1 // panic: assignment to entry in nil map

正确做法是:

m := make(map[string]int)
m["key"] = 1 // 正常

如何选择 new 还是 make

基本原则是:

  • 需要创建 slice、map 或 channel 并立即使用 → 用 make
  • 需要为结构体或基本类型分配堆内存并获取指针 → 用 new
  • 不确定时,优先考虑是否需要指针或是否是三种引用类型

注意:Go 中大多数情况下不需要显式使用 new,因为变量声明和字面量构造已足够。new 更多用于需要返回堆对象指针的函数中。

基本上就这些。掌握 new 和 make 的区别,关键是理解“分配”和“初始化”的不同层次。make 不只是分配,更是让引用类型进入可用状态的关键步骤。

以上就是Golang中的new与make有何区别_Golang内存分配函数使用详解的详细内容,更多请关注其它相关文章!


# 内存管理  # 靖江网站营销推广  # 沙井seo优化工具  # 建设网站公司怎么收费  # 宜宾短视频推广营销招聘  # 湖南微信网站建设  # 网站优化去哪注册软件  # 短剧推广的营销方法包括  # 星空网站建设素材  # 注册哈尔滨建设信息网站  # 山东seo排名电话  # 尤其是  # 有何区别  # go  # 是一个  # 都是  # 的是  # 适用于  # 键值  # 三种  # 数据结构  # 键值对  # 区别  # go语言  # golang 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: poki网页游戏推荐_poki免费游戏平台入口  Sublime Text怎么显示空格和制表符_Sublime显示不可见字符设置  C++的std::forward_list怎么用_C++ STL中单向链表容器的特点与应用  windows10怎么查看硬盘序列号_windows10硬盘id查询命令  MongoDB Aggregation:在嵌套对象数组中精确匹配ObjectId  拼多多视频播放卡顿如何处理 拼多多视频播放优化技巧  我的世界官方游戏入口 我的世界官网平台直达链接  整合Supabase认证与Django模型:跨模式迁移的解决方案  深入理解J*a编译器的兼容性选项:从-source到--release  知音漫客正版漫画平台_知音漫客官网账号登录  2025年云电脑操作系统体验 | 无需本地硬件,随时随地使用高性能PC  Spyder启动失败:字体文件权限拒绝错误解决方案  《刺客信条4:黑旗》重制版新细节曝光:无缝加载 地图更细致!  Angular Material 垂直步进器:实现底部到顶部排序的教程  使用CSS更改登录屏幕输入框中PNG图标颜色的策略与局限性  Lar*el用户头像管理:实现图片缩放、存储与旧文件安全删除的最佳实践  Go语言中的*string:深入理解字符串指针  qq浏览器如何查看和导出已保存的密码 qq浏览器密码管理器数据备份教程  在Runstone环境中高效处理TasteDive API的JSON数据  网站内容防复制粘贴的实现策略与局限性  快手官方唯一登录入口 谨防山寨钓鱼网站  夸克浏览器图书入口 夸克手机浏览器阅读入口  C++如何操作注册表_Windows平台下C++读写注册表的API函数详解  Composer中的^和~符号代表什么_精通Composer版本号语义化约束  怎样更改Windows系统的默认安装路径_避免C盘爆满的终极设置【技巧】  Composer的 "licenses" 命令如何帮助你遵守开源协议_检查项目依赖的许可证合规性  铃兰之剑为这和平的世界希里技能组及加点推荐  b站怎么看视频的弹幕数量_b站弹幕数量查看方法  为什么我的微信朋友圈看不到别人的更新_微信朋友圈更新显示异常解决方法  谷歌浏览器怎么给标签页静音_Chrome标签静音快捷操作  b站怎么删除评论_b站评论管理与删除操作  高德地图总提示网络异常怎么办 高德地图离线导航设置与网络排查方法  抖音网页版快捷访问 抖音网页版网页版入口操作教程  Golang如何使用net/url解析URL_Golang URL解析与处理方法  利用Bokeh CustomJS动态控制DataTable列可见性  python3时间如何用calendar输出?  iwriter统一登录平台 iwrite账号密码登录页面  12306选座系统怎么选连座_12306选座多人连坐操作方法  迅雷下载到U盘速度很慢怎么办_迅雷U盘下载慢优化方法  火锅吃太多会怎样 火锅吃太多会上火吗  《GTA6》开发画面疑似泄露!这次可不是AI了  字由网在线版登录地址 字由网网页版安全入口  优化 Python 函数中的条件逻辑:解决 if-else 嵌套与参数选择问题  天眼查怎么看公司融资情况 天眼查企业融资历史查询步骤【攻略】  批改网学生版PC登录 批改网官网登录系统入口  文本文档写html代码怎么运行_文本文档html代码运行步骤【教程】  Python自定义类排序:解决lambda键值访问TypeError的实践指南  C++如何连接MySQL数据库_C++使用Connector/C++操作MySQL数据库教程  TikTok网页版直接登录 TikTok网页端官方平台入口  打开就能玩的植物大战僵尸 植物大战僵尸网页版传送门 

搜索