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
相关产品推荐
相关产品推荐

