直接回答:goroutine 泄漏指 goroutine 永远无法退出、持续累积。最常见的原因:向无缓冲或无人接收的 channel 发送(永久阻塞在 send);select 等待的 channel 永远不会就绪;忘了调用 cancel 导致 context 派生的 goroutine 不退出;无限循环里没有退出信号或退出条件永远不满足;time.Ticker 没有 Stop。泄漏的 goroutine 连带其持有的内存都无法回收。

展开解析:预防的核心模式是"每个长期 goroutine 都要有一条退出通道":接收方可能提前离开时,发送方用 select { case ch <- v: case <-ctx.Done(): return } 双路等待;启动 worker 的地方负责在关闭路径上 cancel()。排查手段:pprof 的 goroutine profile(/debug/pprof/goroutine?debug=2)直接列出所有 goroutine 的栈,数量异常且栈顶相同的簇就是泄漏点;runtime.NumGoroutine() 可接入监控告警。注意 HTTP 服务端天然防御部分泄漏——连接断开 ctx 取消,但自己起的后台 goroutine 不在此列。压测时对比压测前后的 goroutine 数,是 CI 里可自动化的泄漏回归。

追问方向:close(channel) 后发送方会怎样,为何推荐"发送方关闭"原则?errgroup 如何管理 goroutine 生命周期?泄漏的 goroutine 会阻止 GC 回收什么?

(约 430 字)