Можно ли мультиплексировать несколько каналов в один?

Идея состоит в том, чтобы иметь переменное количество каналов в срезе, помещать каждое значение, полученное через них, в один канал и закрывать этот выходной канал после закрытия последнего из входных каналов. Что-то вроде этого, но для количества каналов больше двух:

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

12
задан Denys Séguret 13 September 2012 в 16:28
поделиться