Запустите по читателю на входной канал и закрывайте общий выход только после завершения всех читателей. Это 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 не должна.