Warum Gehen Panik auf das schreiben zu einem geschlossenen Kanal?
Warum Gehen Panik auf das schreiben zu einem geschlossenen Kanal?
Während die value, ok := <-channel
idiom für das Lesen von Kanälen, und so ist die ok-Ergebnis getestet werden kann, zur Kollision mit einem geschlossenen Kanal:
//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)
}
Ausgabe:
read 2 from channel
channel is closed
channel is closed
Ausführen "das Lesen von geschlossenen Kanal" auf Spielplatz
Schreiben zu einem möglicherweise geschlossenen Kanal ist unübersichtlich, da Gehen Sie in Panik geraten, wenn Sie einfach nur versuchen zu schreiben, 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
}
Ausgabe:
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
Ausführen "schreiben in geschlossenen Kanal" auf Spielplatz
Soweit ich weiß, gibt es nicht eine einfachere Ausdrucksweise ist für das schreiben in ein eventuell geschlossener Kanal ohne in Panik zu geraten. Warum nicht? Was ist die Argumentation hinter solchen asymmetrischen Verhalten zwischen Lesen und schreiben?
- Wie würden wir wissen? Fragen, auf die google-Gruppe golang, vielleicht einer der Autoren wird dir Antworten. Ich kann mir denken, ein Grund. Es ist einfach ein gutes design zu schließen, einen Kanal auf der Produzenten-Seite. Panik zwingt Sie, entwerfen Sie Ihre Anwendung in einer Weise.
- Schließen Sie ein Kanal ist ein signal, dass hier keine Werte mehr. In einem schreiben an einen geschlossenen Kanal ist ein Programm Fehler, die Panik.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Aus der Go Language Spec:
Wenn Sie schreiben, um einen geschlossenen Kanal, das Programm Panik. Sie könnten möglicherweise fangen Sie diesen Fehler mit wiederherstellen wenn Sie wirklich wollen, zu tun, aber in einer situation, wo Sie nicht wissen, ob Sie den Kanal, den Sie schreiben offen ist, ist meistens ein Zeichen für einen Fehler in dem Programm.
Einige Zitate:
--
--
Quelle: Gehen design-detail rationale Frage - Kanal in der Nähe