Ist es möglich, mehrere Kanäle in einen zu multiplexen?

Die Idee ist, eine variable Anzahl von Kanälen in einem Slice zu haben, jeden durch sie empfangenen Wert in einen einzelnen Kanal zu verschieben und diesen Ausgangskanal zu schließen, sobald der letzte der Eingangskanäle geschlossen ist. Etwas in der Art, aber für eine Reihe von Kanälen mehr als zwei:

func multiplex(cin1, cin2, cout chan int) {
    n := 2
    for {
        select {
        case v, ok := <-cin1:
            if ok {
                cout <- v
            } else {
                n -= 1
            }

        case v, ok := <-cin2:
            if ok {
                cout <- v
            } else {
                n -= 1
            }
        }

        if n == 0 {
            close(cout)
            break
        }
    }
}

Der obige Code vermeidet ein Besetztschleifen, da es keine gibtdefault case, was gut ist (EDIT: Es sieht so aus, als ob das Vorhandensein von ", ok" die select-Anweisung nicht blockiert und die Schleife doch beschäftigt ist. Stellen Sie sich den Code für das Beispiel so vor, als würde er blockieren ). Könnte die gleiche Funktionalität auch mit einer beliebigen Anzahl von Eingangskanälen erreicht werden? Dies könnte natürlich durch paarweises Reduzieren des Slice auf einen einzigen Kanal geschehen, aber ich wäre nach Möglichkeit mehr an einer einfacheren Lösung interessiert.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage