# goroutine 泄漏: N 个 goroutine 阻塞在 chan receive（pprof 显示 [chan receive]）

- **ID:** `go/goroutine-leak-blocked-receive`
- **领域:** go
- **类别:** resource_error
- **验证级别:** ai_generated
- **修复率:** 80%

## 根因

启动了从 channel 读取的 worker，但该 channel 从未被关闭也从未写入，导致它们永久阻塞在接收上。

## 版本兼容性

| 版本 | 状态 | 引入 | 弃用 |
|------|------|------|------|
| 1.0+ | active | — | — |

## 解决方案

1. **** (96% 成功率)
   ```
   go func() {
    defer close(ch)
    for _, x := range items { ch <- x }
}()
for v := range ch { process(v) }
   ```
2. **** (94% 成功率)
   ```
   for {
    select {
    case v, ok := <-ch:
        if !ok { return }
        process(v)
    case <-ctx.Done():
        return
    }
}
   ```

## 无效尝试

- **** — If the loop uses for v := range ch, time.After cannot be applied; converting to select changes semantics and still leaks if done incorrectly. (60% 失败率)
- **** — Masks the leak; goroutine count still grows within the interval and can OOM under bursts. (85% 失败率)
