Aus einer Select-Anweisung ausbrechen, wenn alle Kanäle geschlossen sind
Stellen Sie sich ein Szenario vor, in dem mehrere Goroutinen Daten an einzelne Kanäle senden, und zwar auf Wunsch um diese Daten in beliebiger Reihenfolge zu verbrauchen. Die Verwendung einer Select-Anweisung bietet eine bequeme Möglichkeit, gleichzeitige Eingaben aus mehreren Quellen zu verarbeiten. Die Herausforderung entsteht jedoch, wenn Sie den Kreislauf erst verlassen müssen, wenn alle Kanäle geschlossen sind.
Naive Lösung
Ein intuitiver Ansatz könnte darin bestehen, die Verfügbarkeit jedes Kanals zu überprüfen durch Verwendung der ok-Flagge. Allerdings ist diese Lösung fehleranfällig, da ein geschlossener Kanal bei Auswahl wieder verfügbar wird. Dies führt zu einer Endlosschleife, wie in diesem Spielplatzbeispiel gezeigt: http://play.golang.org/p/rOjdvnji49.
Verbesserte Lösung
Ein weiteres Ein effektiver Ansatz besteht darin, die Tatsache auszunutzen, dass ein Nullkanal niemals für die Kommunikation bereit ist. Jedes Mal, wenn ein Kanal geschlossen wird, kann er auf Null gesetzt werden, um sicherzustellen, dass er von zukünftigen Select-Anweisungen ausgeschlossen wird. Dadurch wird garantiert, dass die Schleife erst endet, wenn alle Kanäle geschlossen sind:
for { select { case x, ok := <-ch: fmt.Println("ch1", x, ok) if !ok { ch = nil } case x, ok := <-ch2: fmt.Println("ch2", x, ok) if !ok { ch2 = nil } } if ch == nil && ch2 == nil { break } }
Spielplatzbeispiel: http://play.golang.org/p/8lkV_Hffyj
Praktische Überlegungen
In der Praxis ist es unwahrscheinlich, dass Sie eine große Anzahl von Kanälen in einer einzigen Select-Anweisung verarbeiten müssen. Wenn ein solches Szenario auftritt, ist es ratsam, eine speziellere Lösung zu verwenden, beispielsweise einen Kanalmultiplexer, um den Code nicht mit übermäßigen Nullprüfungen zu überladen.
Das obige ist der detaillierte Inhalt vonWie kann ich aus einer Select-Anweisung ausbrechen, wenn in Go alle Kanäle geschlossen sind?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!