Aus einer Select-Anweisung ausbrechen, wenn alle Kanäle geschlossen sind
In Go ist die Verwendung einer Select-Anweisung eine effiziente Möglichkeit, mehrere Kanäle zu verwalten gleichzeitig. Wenn man jedoch mit Kanälen arbeitet, die irgendwann geschlossen werden, muss man einen präzisen Weg finden, eine Schleife durchzuführen, bis alle Kanäle geschlossen sind.
Betrachten wir das folgende Beispiel, in dem zwei Goroutinen unabhängig voneinander Daten erzeugen und an Kanäle senden. Die Haupt-Goroutine verbraucht diese Daten ohne Rücksicht auf die Reihenfolge.
for { select { case p, ok := <-mins: if ok { fmt.Println("Min:", p) } case p, ok := <-maxs: if ok { fmt.Println("Max:", p) } } }
Während diese Select-Anweisung es ermöglicht, jede Ausgabe zu konsumieren, sobald sie ankommt, gibt es keine Möglichkeit, explizit aus der Schleife auszubrechen, wenn beide Kanäle geschlossen wurden.
Die vorgeschlagene Lösung, die darin besteht, den Status jedes Kanals mithilfe boolescher Flags zu verfolgen, kann für eine große Anzahl von Kanälen unhandlich werden.
Eine elegantere Lösung besteht darin, einem Kanal Null zuzuweisen, wenn es hat geschlossen. Dadurch wird sichergestellt, dass der Nullkanal niemals für die Kommunikation ausgewählt wird.
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 } }
Durch die Verwendung von Nullkanälen überspringt die Select-Anweisung automatisch geschlossene Kanäle. Wenn alle Kanäle geschlossen sind, wird die Schleife unterbrochen. Diese Lösung bietet eine saubere und effiziente Möglichkeit, schließende Kanäle innerhalb einer Select-Anweisung zu verarbeiten, unabhängig von der Anzahl der beteiligten Kanäle.
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!