É possível multiplexar vários canais em um?
A idéia é ter um número variável de canais em uma fatia, empurrar cada valor recebido através deles em um único canal e fechar esse canal de saída quando o último dos canais de entrada for fechado. Algo parecido com isto, mas para vários canais mais de dois:
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
}
}
}
O código acima evita o looping ocupado, pois não hádefault
caso, o que é bom (EDIT: parece que a presença de ", ok" faz o select declaração non-blocking e o loop está ocupado depois de tudo. Mas, por causa do exemplo, pense no código como se fosse bloquear ). O mesmo tipo de funcionalidade também poderia ser alcançado com um número arbitrário de canais de entrada? Obviamente, isso poderia ser feito reduzindo-se a fatia a um único canal, mas eu estaria mais interessado em uma solução mais simples, se possível.