In Golang, wie um zu testen, ob ein Kanal ist in der Nähe und nur zu senden, um Sie, wenn es nicht geschlossen?
In Golang, wenn ein Kanal channel
ist geschlossen, ich kann immer noch Lesen, es mithilfe der folgenden syntax ein, und ich kann testen ok
zu sehen, wenn es geschlossen ist.
value, ok := <- channel
if !ok {
//channel was closed and drained
}
Jedoch, wenn ich nicht weiß, ob ein Kanal ist geschlossen und blind schreiben zu können, kann ich bekam eine Fehlermeldung. Ich möchte wissen, ob es irgendeinen Weg gibt, dass ich testen können der Kanal und nur schreiben, wenn es nicht geschlossen ist. Ich Stelle diese Frage, weil ich weiß manchmal nicht, wenn ein Kanal geschlossen ist oder nicht in einer goroutine.
- wenn Sie nicht wissen, ob ein Kanal geschlossen ist oder nicht und blind schreiben zu können, dann haben Sie ein schlecht konzipiertes Programm. Redesign ist es so, dass es keine Möglichkeit gibt, zu schreiben, in es nach ist es geschlossen.
- Ja @ain, ich Stimme völlig mit Ihnen! Ich will einfach nur wissen, technisch, ob es eine Möglichkeit gibt, das zu tun.
- Verwandte / mögliche Duplikate von: Schließen-Kanal unbekannter Länge
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nicht. Die Faustregel hier ist, dass nur Schriftsteller sollte in der Nähe der Kanäle, so wissen Sie, dass Sie sollten nicht schreiben, dass der Kanal nicht mehr.
Einige einfache code würde wie folgt Aussehen:
sync.WaitGroup
in dieser Antwort: Schließen-Kanal unbekannter Länge.Wenn einige goroutins schreiben Kanal kann man auch
nil
es stattclose
und verwendenselect
zu Lesen und zu schreiben. So etwasVersuchen, es funktioniert https://play.golang.org/p/sp8jk961TB
default
, wie einswitch
- Anweisung. Ich habe den folgenden code, um zu testen, ob der Kanal geschlossen. Ok var false zurück, wenn der Kanal geschlossen ist und der Wert 0 sein, das ist default nil-Wert für ein int. Hier ist etwas code, um Ihre Frage zu beantworten: ` schließen(ch) auswählen { case value, ok := <-ch: fmt.Println("value ", Wert) fmt.Println("Channel Open", "ok"), default: fmt.Println("oops") } `select
finden Sie in diesem code play.golang.org/p/Q4m4_CJl-sJ