Go 语言中 time.Timer 重置与 Stop 的常见陷阱:从一次 goroutine 泄漏排查说起
在一个长连接推送服务里,每个连接都挂了一个 time.Timer 用来做空闲超时检测。逻辑很直白:每次收到客户端消息就重置定时器,如果超过 30 秒没有新消息就断开连接。上线后内存和 goroutine 数缓慢上涨,pprof 显示大量 goroutine 阻塞在 runtime.gopark,最终定位到 Timer 的重置写法有问题。很多人在使用 time.Timer 时习惯直接调用 Reset,或者 Stop 之后不检查返回值、不排空 channel,结果要么定时器提前触发,要么旧事件残留导致逻辑错乱,...