Слияние нескольких входных каналов в один выходной

Запустите по читателю на входной канал и закрывайте общий выход только после завершения всех читателей. Это fan-in без гарантированного порядка между разными источниками.

Короткий ответ

Что ответить на собеседовании

Запустите по читателю на входной канал и закрывайте общий выход только после завершения всех читателей. Это fan-in без гарантированного порядка между разными источниками.

Подробный разбор

Ответ с пояснениями

Условие

Необходимо реализовать функцию, которая принимает произвольное количество входных каналов и возвращает единый канал, в который будут передаваться все полученные из исходных каналов значения.

func merge(src ...chan int) chan int {
}

Ответ

Запустите по читателю на входной канал и закрывайте общий выход только после завершения всех читателей. Это fan-in без гарантированного порядка между разными источниками.

Реализация с импортом sync:

func merge(src ...chan int) chan int {
    out := make(chan int)
    var wg sync.WaitGroup
    for _, input := range src {
        if input == nil { continue }
        wg.Add(1)
        go func(ch <-chan int) {
            defer wg.Done()
            for value := range ch { out <- value }
        }(input)
    }
    go func() { wg.Wait(); close(out) }()
    return out
}

Nil-входы здесь пропускаются; при пустом списке выход закрывается. Источники должны закрыть свои каналы, а потребитель — дочитать результат. Для раннего прекращения требуется расширить контракт context и проверять отмену как на чтении, так и на отправке. Закрывать входные каналы merge не должна.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

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

Подробнее