Go 面试题:值/引用、defer、GC 与逃逸分析

一、值类型 vs 引用类型

类别 例子
值类型 int/string/struct/array(拷贝即复制)
引用类型 slice/map/channel/func(内部含指针,拷贝共享底层)

传参总是值拷贝:传 slice 拷贝的是结构体头(含指针),底层数组共享,所以改元素会影响原值。

二、defer 与 recover

  • defer 延迟执行,多个时后进先出(LIFO);常用于释放资源;
  • recover 在 defer 里捕获 panic,恢复程序:
defer func() { if r := recover(); r != nil { fmt.Println("recovered", r) } }()

三、GC 与逃逸分析

  • Go 用并发三色标记 GC,STW 极短(亚毫秒级),无需手动管理;
  • 逃逸分析:编译器决定变量放栈(快)还是堆(逃逸后 GC 管)。取地址 &x 且被外部引用时会逃逸到堆;
  • 接口隐式实现:类型只要实现了接口方法即满足,无需声明 implements。

面试常问:defer 执行顺序、channel 关闭规则、slice 与 array 区别、GC 怎么做到低延迟。