L'idea è di avere un numero variabile di canali in una sezione, di inviare ogni valore ricevuto attraverso di essi in un singolo canale e di chiudere questo canale di uscita quando l'ultimo dei canali di input viene chiuso. Qualcosa di simile, ma per un numero di canali più di due:È possibile multiplexare più canali in uno?
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
}
}
}
Il codice di cui sopra evita loop occupato dal momento che non v'è alcuna default
caso, che è buono (EDIT: sembra che la presenza di "ok" rende l'istruzione select non-blocking e il ciclo è occupato dopo tutto, ma per l'esempio, pensate al codice come se fosse bloccato). È possibile ottenere lo stesso tipo di funzionalità anche con un numero arbitrario di canali di input? Ovviamente, ciò potrebbe essere fatto riducendo la slice a coppie su un singolo canale, ma sarei più interessato a una soluzione più semplice, se possibile.
Ah, soluzione molto bella, chiara e concisa. Grazie! – elpres
V'è ora un pacchetto con una funzione (https://godoc.org/github.com/eapache/channels#Multiplex) che risolve il problema utilizzando la riflessione invece di più goroutines. – Evan