Por que o canal da Go pode fechar duas vezes?
Quando eu faço algum código de práticas de go, encontro um problema em que um canal pode ser fechado duas vezes assim:
// jobs.go
package main
import (
"fmt"
)
func main() {
fmt.Println("Hello, playground")
jobs := make(chan int, 5)
done := make(chan bool)
go func() {
for {
j,more := <-jobs
fmt.Println("receive close: ", j, more)
done <- true
}
}()
close(jobs)
<- done
}
Resultado:
~ go run jobs.go
Hello, playground
receive close: 0 false
receive close: 0 false
Mas quando fecho o canal duas vezes manualmente, recebipanic: close of closed channel
.
Por que o código acima pode receber fechar duas vezes?