go runtime_error ai_generated true

panic: close of closed channel

ID: go/channel-close-receive-panic

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

Version Compatibility

VersionStatusIntroducedDeprecatedNotes
1.0+ active — — —

Root Cause

Attempting to close a channel that has already been closed.

generic

中文

试图关闭一个已经关闭的 channel。

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

Common approaches that don't work:

  1. 80% fail

    Hides double-close bug, may lead to inconsistent state

  2. 70% fail

    No built-in way to check if channel is closed without receiving