用途:指导在 Go 中编写惯用并发代码,适用于并行化相互独立的 I/O(fan-out)并限制并发度、构建带背压的多阶段流水线,以及与进程或请求生命周期绑定的后台工作。资料明确提醒:不要仅为让 handler 更快返回而启动无生命周期归属的 goroutine。
主要能力与规则:从父 context 派生 context.WithCancel/WithTimeout/WithDeadline;在启动工作的函数返回前完成取消与 Wait;不忽略子 goroutine 的错误返回值;明确 channel 由谁关闭,接收方不关闭不属于自己的 channel;共享数据在 mutex、channel 或并发结构中选择一种策略;循环中启动 goroutine 时显式绑定迭代变量(v := v)。
context 与 errgroup:使用 golang.org/x/sync/errgroup,g, ctx := errgroup.WithContext(ctx),用 g.SetLimit(8) 限制并发,g.Go 提交任务,g.Wait 汇总错误并在首个错误时取消;同一 ctx 需传播到 DB、HTTP、磁盘等 I/O。
worker pool:jobs channel 配合 sync.WaitGroup,worker 用 for job := range jobs 消费;发送端用 select 监听 ctx.Done(),退出顺序为停止发送、关闭 jobs、Wait workers;缓冲需有理由,无界增长是 bug。
channels 与 select:优先用 channel 传递所有权;可能阻塞的收发配合 ctx.Done();避免通知 channel 加布尔标志的混乱写法,改用 close 或 context;fan-in 可用每源一个 goroutine 或 errgroup 显式合并。
sync:Mutex/RWMutex 用于短小共享状态,WaitGroup 等待 N 个 worker,Once 做幂等初始化,Map/atomics 用于特定场景并先测量;锁持有时间尽量短,不要在 mutex 下做 I/O,并记录受保护状态的不变量。
泄漏与竞态:症状为 goroutine 增长、测试不稳定、关闭不结束;工具为 go test -race、pprof goroutine、测试超时;每个 go 都要有由 context、channel close 或 WaitGroup 驱动的退出条件。
反模式:无取消无 join 的 goroutine、用 time.Sleep 做协调、HTTP 请求中无跟踪的 fire-and-forget、接收方关闭 channel、同一协调同时用 mutex 和 channel、select 后忽略 ctx.Err()、无限制的池。完成标准:生命周期清晰、context 传播并被遵守、子错误被聚合处理、-race 干净、fan-out 处有背压或并发上限、关闭不留孤儿工作。
限制:资料未提供安装命令、版本要求、收费或平台信息。