Go, neden kapalı bir kanala yazı yazıyor?Go, neden kapalı bir kanala yazı yazarken panik yapıyor?
bir kanaldan okuma value, ok := <-channel
deyim kullanabilir ve böylece Tamam sonuç kapalı bir kanal isabet test edilebilir iken:
// 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)
}
Çıktı:
read 2 from channel
channel is closed
channel is closed
Çalıştır "okuma kapalı kanal "on Playground
Muhtemelen kapalı bir kanala yazılması daha düzensizdir, çünkü wri denerseniz, Go panik yapar te kanal kapatıldığında:
//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
}
Çıktı:
"kapalı kanala yazma"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
olarak çalıştır bildiğim kadarıyla
Playground üzerine, yazma için daha basit bir deyim yoktur panik yapmadan muhtemelen kapalı bir kanal içine. Neden olmasın? Okuma ve yazma arasındaki bu tür asimetrik davranışların ardındaki sebep nedir? Go Language Spec itibaren
nasıl bilebiliriz ki? Google golang grubuna sor, belki yazarlardan biri sana cevap verecek. Tek bir sebep düşünebilirim. Üretici tarafında bir kanalı kapatmak için iyi bir tasarım. Panik yapmak, uygulamanızı böyle bir şekilde tasarlamanızı zorlaştırır. – creker
Bir kanalı kapatmak, burada daha fazla değer olmayacak bir işarettir. Kapalı bir kanala yazmak, panik yapan bir program hatasıdır. – JimB