You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言中new(Type)与&Type{}内存分配的区别及最佳实践

Go 中 new(T) 与 &T{} 的内存分配差异及最佳实践

内存分配是否完全一致

首先给出明确结论:当 &T{} 未传入任何自定义初始化字段时,两者的内存分配逻辑在技术层面完全一致。

  • new(T) 的官方语义是分配对应类型的内存空间,初始化为该类型的零值,返回指向该内存空间的指针。
  • &T{} 的语义是创建一个 T 类型的实例,返回该实例的指针。如果结构体字面量 T{} 未填写任何初始化字段,创建的实例本质就是 T 类型的零值,和 new(T) 生成的内存内容、分配流程完全相同。
    两者共用编译器的逃逸分析规则,编译器不会因为语法写法的区别对两者做不同的栈/堆分配决策,不存在某一种写法必然分配在堆或栈的差异。如果 &T{} 传入了自定义初始化字段,那么两者仅内存内容有区别,底层内存分配的流程仍然一致。

实际开发最佳实践

  • 优先选择 &T{} 初始化结构体指针:Go 社区普遍更推荐该写法,和带自定义字段的结构体初始化写法 &T{Field: Value} 风格统一,可读性远高于 new(T)。
  • 基础类型零值指针场景使用 new:如果需要生成 *int、*bool 这类基础类型的零值指针,new(int) 比 &int{0} 写法更简洁,适配性更好。
  • 禁止使用 new 初始化切片、映射、通道:这三类属于引用类型,零值为 nil,new 返回的是指向 nil 的指针,完全无法直接使用,这类场景必须用 make 做初始化。
  • 需要对结构体字段做自定义初始化时,直接使用结构体字面量赋值即可,不要使用 new 后再挨个给字段赋值,避免产生冗余代码。

内容的提问来源于stack exchange,提问作者Objective

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 08:06:03