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.
InformationsquelleAutor Everton | 2016-01-20
Schreibe einen Kommentar