# panic: close of closed channel

- **ID:** `go/channel-close-receive-panic`
- **Domain:** go
- **Category:** runtime_error
- **Verification:** ai_generated
- **Fix Rate:** 80%

## Root Cause

Attempting to close a channel that has already been closed.

## Version Compatibility

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

## Workarounds

1. **** (98% success)
   ```
   var once sync.Once
closeCh := func() {
    once.Do(func() { close(ch) })
}
   ```
2. **** (95% success)
   ```
   go func() {
    defer close(ch)
    // send values
}()
   ```

## Dead Ends

- **** — Hides double-close bug, may lead to inconsistent state (80% fail)
- **** — No built-in way to check if channel is closed without receiving (70% fail)
