贝利信息

如何在Golang中使用new与make_Golang内存分配差异解析

日期:2026-01-15 00:00 / 作者:P粉602998670
new返回*T类型零值指针,make返回T类型已初始化引用值;slice/map/chan必须用make,结构体用new或&T{},不可用make。

new 和 make 都返回指针,但类型完全不同

new 返回的是指向零值的指针,类型为 *Tmake 返回的是引用类型本身(非指针),类型为 T(如 []intmap[string]intchan int)。试图用 make 初始化结构体或基本类型会编译失败。

slice、map、chan 必须用 make,不能用 new

这三类类型在 Go 中是引用类型,底层由 header 结构(含指针、长度、容量等)描述。new 只分配 header 内存并清零,得到的是一个 nil 值;而 make 不仅分配 header,还初始化其字段,并为底层数组/哈希表/队列分配实际内存。

new 适合快速获得零值指针,尤其用于结构体

当需要一个指向已初始化结构体的指针时,new(T) 等价于 &T{},但更简洁。它不调用任何构造逻辑,也不支持字段初始化。

type User struct {
   

ID int Name string } u1 := new(User) // 等价于 &User{} u2 := &User{} // 同上,语义更直观 u3 := &User{ID: 1} // ❌ new 无法做到字段赋值,只能靠 &T{...}

性能与逃逸:new 和 make 都可能触发堆分配

是否分配在堆上,取决于编译器逃逸分析,和用 new 还是 make 无直接关系。但行为模式会影响判断:

别默认认为 new 更“轻量”——它只是语义不同,不是性能优化手段。