Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann ich aus einer „select“-Anweisung ausbrechen, wenn in Go alle Kanäle geschlossen sind?

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

DDD
DDDOriginal
2024-11-12 19:42:02398Durchsuche

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)
        }
    }
}

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!

Stellungnahme:
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