go runtime_error ai_generated true

panic: send on closed channel

ID: go/channel-close-on-sender-panic

Also available as: JSON · Markdown · 中文
80%Fix Rate
82%Confidence
0Evidence
2024-05-20First Seen

Version Compatibility

VersionStatusIntroducedDeprecatedNotes
1.20 active

Root Cause

Sending to a channel after it has been closed causes a runtime panic.

generic

中文

在通道关闭后向其发送数据会导致运行时恐慌。

Workarounds

  1. 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")
    }
  2. 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:

  1. 60% fail

    Recovery doesn't prevent data loss or inconsistency; the sender state is corrupted.

  2. 80% fail

    len() doesn't indicate closed status; a closed channel can still have buffered items.

  3. 50% fail

    Mutex doesn't prevent closing while sending; race condition remains.