Можно ли объединить несколько каналов в один?

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

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 case, что хорошо (РЕДАКТИРОВАТЬ: похоже, что присутствие & quot ;, ok & quot; делает оператор select неблокирующим, и цикл все-таки занят. Но для примера рассмотрим код так, как если бы он был блок). Может ли такая же функциональность также быть достигнута с произвольным числом входных каналов? Очевидно, что это можно сделать путем сокращения среза попарно до одного канала, но я бы больше интересовался более простым решением, если это возможно.

Ответы на вопрос(3)

Ваш ответ на вопрос