标准答案
- race detector 能帮助发现部分数据竞争,但不能证明业务状态转换正确。
- 死锁通过 goroutine dump、锁顺序和 channel 等待图定位。
- 泄漏关注 goroutine 数量趋势、阻塞栈、未关闭 channel、context 和结果发送。
- 修复要定义所有权、取消和关闭协议,并用压力和故障测试验证。
题目解析
data race 是未同步的共享内存访问,deadlock 是 goroutine/锁/channel 互相等待,goroutine leak 是任务失去退出路径并持续占用资源。三者可能同时发生,但证据和修复不同。
race detector 能发现部分访问竞争,goroutine dump 能展示等待栈和锁/channel 关系;泄漏还要看 goroutine 数量、任务年龄、context 和资源趋势。
修复要定义所有权、关闭者、取消和结果发送边界,并在正常、异常、超时和停机路径验证退出。数量高不一定泄漏,数量不高也可能有逻辑死锁。
常见误区
- 误区:看到 goroutine 多就判定泄漏。改正:比较基线、任务年龄、阻塞栈和流量回落后的数量。
- 误区:race detector 通过就忽略死锁。改正:单独分析锁顺序、channel 等待和停机路径。
- 误区:只在成功路径关闭 channel 或取消 context。改正:异常、取消和超时路径也必须释放和唤醒。