go
runtime_error
ai_generated
true
panic: send on closed channel
ID: go/channel-close-on-sender-panic
80%Fix Rate
82%Confidence
0Evidence
2024-05-20First Seen
Version Compatibility
| Version | Status | Introduced | Deprecated | Notes |
|---|---|---|---|---|
| 1.20 | active | — | — | — |
Root Cause
Sending to a channel after it has been closed causes a runtime panic.
generic中文
在通道关闭后向其发送数据会导致运行时恐慌。
Workarounds
-
85% success
ch := make(chan int) close(ch) // Use select with a done channel to avoid sending after close select { case ch <- 1: default: fmt.Println("channel closed") } -
90% success
var mu sync.RWMutex closed := false // In sender: mu.RLock() if !closed { ch <- 1 } mu.RUnlock() // In closer: mu.Lock() close(ch) closed = true mu.Unlock()
Dead Ends
Common approaches that don't work:
-
60% fail
Recovery doesn't prevent data loss or inconsistency; the sender state is corrupted.
-
80% fail
len() doesn't indicate closed status; a closed channel can still have buffered items.
-
50% fail
Mutex doesn't prevent closing while sending; race condition remains.