Warum reagiert Go beim Schreiben auf einen geschlossenen Kanal?Warum reagiert Go beim Schreiben auf einen geschlossenen Kanal?
Während kann man die value, ok := <-channel
Idiom für das Lesen von Kanälen verwenden, und somit kann das ok Ergebnis für das Schlagen mit einem geschlossenen Kanal getestet werden:
// reading from closed channel
package main
import "fmt"
func main() {
ch := make(chan int, 1)
ch <- 2
close(ch)
read(ch)
read(ch)
read(ch)
}
func read(ch <-chan int) {
i,ok := <- ch
if !ok {
fmt.Printf("channel is closed\n")
return
}
fmt.Printf("read %d from channel\n", i)
}
Ausgang:
read 2 from channel
channel is closed
channel is closed
Run „aus der Lektüre geschlossener Kanal "on Playground
Das Schreiben in einen möglicherweise geschlossenen Kanal ist komplizierter, weil Go in Panik gerät, wenn Sie einfach versuchen, wri te, wenn der Kanal geschlossen ist:
//writing to closed channel
package main
import (
"fmt"
)
func main() {
output := make(chan int, 1) // create channel
write(output, 2)
close(output) // close channel
write(output, 3)
write(output, 4)
}
// how to write on possibly closed channel
func write(out chan int, i int) (err error) {
defer func() {
// recover from panic caused by writing to a closed channel
if r := recover(); r != nil {
err = fmt.Errorf("%v", r)
fmt.Printf("write: error writing %d on channel: %v\n", i, err)
return
}
fmt.Printf("write: wrote %d on channel\n", i)
}()
out <- i // write on possibly closed channel
return err
}
Ausgang:
write: wrote 2 on channel
write: error writing 3 on channel: send on closed channel
write: error writing 4 on channel: send on closed channel
Run "Schreiben in geschlossenem Kanal" auf Playground
Soweit ich weiß, gibt es nicht eine einfachere Idiom zum Schreiben in einen möglicherweise geschlossenen Kanal ohne Panik. Warum nicht? Was ist der Grund für ein solches asymmetrisches Verhalten zwischen Lesen und Schreiben?
Wie würden wir das wissen? Fragen Sie bei Google Golang Gruppe, vielleicht wird einer der Autoren Ihnen antworten. Ich kann mir einen Grund vorstellen. Es ist nur ein gutes Design, um einen Kanal auf Produzentenseite zu schließen. Panicking zwingt Sie, Ihre Anwendung so zu gestalten. – creker
Schließen eines Kanals ist ein Signal, dass es hier keine Werte mehr geben wird. Schreiben in einen geschlossenen Kanal ist ein Programmfehler, der in Panik gerät. – JimB