Go面试题更新 2026-08-03

在 Go 语言中,内建函数 make 和 new 都用于分配内存,它们在用途、返回类型和初始化行为上有哪些具体区别?请分别说明。

考察说明

考查对 Go 语言内存分配机制的理解,区分 make 和 new 的适用场景与差异。

回答思路

  1. 【回答框架 1】make 主要用于分配并初始化 slice、map 和 channel 三种引用类型,返回的是该类型的非零值(即已可用的实例),而非指针;new 用于分配任意类型的内存,返回指向该类型零值的指针。
  2. 【回答框架 2】以 slice 为例,make([]int, 5) 会创建一个长度为 5、容量为 5 的切片,底层数组已初始化;new([]int) 只返回一个指向 nil 切片的指针,使用前仍需通过 make 或其他方式初始化。
  3. 【回答框架 3】map 和 channel 同理,make(map[string]int) 得到可立即使用的空 map,new(map[string]int) 得到指向 nil map 的指针,向 nil map 写入会引发 panic;make 对 channel 也完成缓冲区分配。
  4. 【回答框架 4】因此,make 仅适用于 slice、map、channel,其返回值为 T 而非 *T;new 适用于任何类型,返回 *T。实际编码中,基本类型或结构体通常用 &T{} 或 new(T),而引用类型必须用 make。
  5. 【回答框架 5】从底层看,new 分配内存并置零,make 不仅分配还完成内部数据结构(如 slice 的数组、map 的哈希表)的初始化,这也是两者不能互换的原因。
  6. 【关键点 1】make 只用于 slice、map、channel,返回已初始化的非指针值。
  7. 【关键点 2】new 适用于所有类型,返回指向零值的指针(*T)。
  8. 【关键点 3】make 分配并初始化内部结构,new 仅置零内存。
  9. 【关键点 4】对 nil map 或 nil channel 进行写入或操作会 panic。
  10. 【关键点 5】需要返回引用类型实例时使用 make,需要指针时使用 new 或 &T{}。
  11. 【易错点 1】误用 new 创建 slice、map 或 channel,得到的 nil 引用无法直接使用。
  12. 【易错点 2】忘记 channel 本身是引用类型,用 new 后直接发送会导致死锁。
  13. 【易错点 3】对 nil map 赋值会 panic,需先 make 初始化。