一、值类型 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 怎么做到低延迟。