Идея состоит в том, чтобы иметь переменное количество каналов в срезе, помещать каждое значение, полученное через них, в один канал и закрывать этот выходной канал после закрытия последнего из входных каналов. Что-то вроде этого, но для количества каналов больше двух:
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
}
}
}
Приведенный выше код позволяет избежать зацикливания, так как нет случая default
, что хорошо (EDIT: похоже на наличие ", ok" делает оператор select неблокирующим, и цикл, в конце концов, занят. Но ради примера подумайте о коде так, как если бы он блокировался). Можно ли добиться такой же функциональности с произвольным количеством входных каналов? Очевидно, это можно было бы сделать, сократив слайс попарно до одного канала, но меня больше интересовало бы более простое решение, если это возможно.