# 恐慌：从已关闭的通道接收（在select中）

- **ID:** `go/goroutine-select-on-closed-channel`
- **领域:** go
- **类别:** runtime_error
- **验证级别:** ai_generated
- **修复率:** 80%

## 根因

在已关闭的通道上select会立即接收零值，如果不处理可能导致意外行为。

## 版本兼容性

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

## 解决方案

1. **Use two-value receive to check if channel is closed** (95% 成功率)
   ```
   select {
case val, ok := <-ch:
    if !ok {
        // channel closed
    }
    // process val
}
   ```
2. **Set channel to nil after close to disable it** (85% 成功率)
   ```
   close(ch)
ch = nil
select {
case <-ch: // blocked because nil
}
   ```

## 无效尝试

- **Ignoring closed channel in select** — Closed channel always returns zero value immediately; select may not behave as expected. (70% 失败率)
- **Using recover() to catch zero value** — Receive from closed channel doesn't panic; it returns zero value with ok=false. (90% 失败率)
