Wie kann ich aus einer „select'-Anweisung ausbrechen, wenn in Go alle Kanäle geschlossen sind?

DDD
Freigeben: 2024-11-12 19:42:02
Original
397 Leute haben es durchsucht

How to Break Out of a `select` Statement When All Channels Are Closed in Go?

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)
        }
    }
}
Nach dem Login kopieren

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
    }
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage