# goroutine leak: N goroutines blocked in chan receive (pprof shows [chan receive])

- **ID:** `go/goroutine-leak-blocked-receive`
- **Domain:** go
- **Category:** resource_error
- **Verification:** ai_generated
- **Fix Rate:** 80%

## Root Cause

Workers were started to read from a channel that was never closed and never written to, so they block on receive forever.

## Version Compatibility

| Version | Status | Introduced | Deprecated |
|---------|--------|------------|------------|
| 1.0+ | active | — | — |

## Workarounds

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

## Dead Ends

- **** — 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% fail)
- **** — Masks the leak; goroutine count still grows within the interval and can OOM under bursts. (85% fail)
