Go语言new返回的是指针吗_Golang new函数使用详解
发布时间 - 2026-01-28 00:00:00 点击率:次new 返回指向类型 T 零值的指针,仅分配内存、清零并返回地址,不初始化;适用于泛型、反射等需零值指针的底层场景,日常开发中应优先使用 &T{} 或 make。
Go 的 new 函数确实返回指针,但仅限于“指向零值的指针”
是的,new 的返回值类型永远是 *T —— 一个指向类型 T 零值的指针。它不做任何额外初始化,不调用方法,不构造底层数组或哈希表,只干三件事:分配内存、清零、返回指针地址。
-
new(int)→ 返回*int,值为0(不是未定义,是确定的零值) -
new(string)→ 返回*string,解引用后是"" -
new([]int)→ 返回*[]int,解引用后是nil切片(⚠️不能直接append) -
new(map[string]int)→ 返回*map[string]int,解引用后是nilmap(⚠️不能直接赋值,会 panic)
什么时候该用 new?多数时候其实不该用
new 的适用场景非常窄。它不是“创建对象”的常规手段,而是为特定需求服务的底层工具:
- 需要一个明确指向零值的指针,且类型太复杂写
&T{}太冗长(比如new([1024]byte)或嵌套泛型类型) - 在泛型函数中,类型
T在编译期未知,无法用字面量构造,只能靠new(T) - 反射场景下需分配零值内存并获取指针(如
reflect.New内部就调用new) - 你正在写运行时或内存分析相关代码,需要显式控制零值分配路径
日常开发中,&MyStruct{} 更直观,make([]int, 0) 更安全,new 很少是最佳选择。
new 和 make 混用会出什么错?
最典型的问题是误以为 new([]int) 能得到一个可用切片:
slicePtr := new([]int) // *slicePtr 是 nil!下面这行会 panic: // append(*slicePtr, 1)
而 make 返回的是值本身,不是指针:
-
new([]int)→ 类型是*[]int,值为nil -
make([]int, 5)→ 类型是[]int,值为长度 5、容量 5 的切片 - 想获得“可 append 的切片指针”,应写
s := make([]int, 0); ptr := &s,而非new([]int)
为什么函数里能安全返回局部变量的指针,却不用 new?
因为 Go 编译器的逃逸分析会自动把“需要被外部访问的局部变量”分配到堆上。所以像 func NewInt(v int) *int { return &v } 是完全合法且高效的 —— 它比 new(int) 后再赋值更直接:
-
new(int):分配 → 清零 → 返回指针 → 再赋值(两步) -
&v(逃逸后):分配(带初值)→ 返回指针(一步)
这也是为什么标准库几乎不用 new:构造函数如 bytes.NewBuffer、sync.Pool.Get 等,都直接返回带初值的指针,而不是先零值再填充。
真正容易被忽略的点是:new 不解决“初始化逻辑”,它只是内存分配的起点;而绝大多数业务代码要的不是“零值指针”,而是“已初始化的对象指针”。别让语法糖掩盖了语义意图。
# go
# golang
# go语言
# app
# 工具
# win
# 标准库
# 为什么
# String
# 构造函数
# 局部变量
# int
# 指针
# 堆
# 值类型
# 泛型
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何生成API文档?(Swagger/OpenAPI教程)
潮流网站制作头像软件下载,适合母子的网名有哪些?
nodejs redis 发布订阅机制封装实现方法及实例代码
深圳网站制作培训,深圳哪些招聘网站比较好?
武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?
Java类加载基本过程详细介绍
Laravel如何编写单元测试和功能测试?(PHPUnit示例)
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
如何在阿里云通过域名搭建网站?
如何选择可靠的免备案建站服务器?
长沙企业网站制作哪家好,长沙水业集团官方网站?
laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法
ChatGPT 4.0官网入口地址 ChatGPT在线体验官网
简历没回改:利用AI润色让你的文字更专业
Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程
uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址
Laravel怎么实现微信登录_Laravel Socialite第三方登录集成
jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】
Laravel如何与Pusher实现实时通信?(WebSocket示例)
Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤
Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录
网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?
香港服务器部署网站为何提示未备案?
Win11关机界面怎么改_Win11自定义关机画面设置【工具】
Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用
如何批量查询域名的建站时间记录?
Android Socket接口实现即时通讯实例代码
Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案
Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明
在线教育网站制作平台,山西立德教育官网?
Android自定义控件实现温度旋转按钮效果
使用PHP下载CSS文件中的所有图片【几行代码即可实现】
Java垃圾回收器的方法和原理总结
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】
济南网站建设制作公司,室内设计网站一般都有哪些功能?
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程
Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
大学网站设计制作软件有哪些,如何将网站制作成自己app?
Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控
Python高阶函数应用_函数作为参数说明【指导】
Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程
Laravel如何实现API速率限制?(Rate Limiting教程)
高性能网站服务器配置指南:安全稳定与高效建站核心方案
如何在自有机房高效搭建专业网站?
Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】
Laravel如何使用Blade模板引擎?(完整语法和示例)
微信小程序 require机制详解及实例代码


