Слияние каналов выполняют читателями, пересылающими данные в общий выход. WaitGroup позволяет закрыть его только тогда, когда все входные потоки закончились.
Слияние нескольких каналов в один поток
Слияние каналов выполняют читателями, пересылающими данные в общий выход. WaitGroup позволяет закрыть его только тогда, когда все входные потоки закончились.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Требуется реализовать функцию merge, которая собирает данные из нескольких входных каналов и передаёт их в единый выходной канал.
Ответ
Слияние каналов выполняют читателями, пересылающими данные в общий выход. WaitGroup позволяет закрыть его только тогда, когда все входные потоки закончились.
Вариант для int, нужен sync:
func merge(inputs ...<-chan int) <-chan int {
out := make(chan int)
var wg sync.WaitGroup
for _, input := range inputs {
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-входы пропускаются. Источники закрывают свои каналы, получатель дочитывает выход. Для раннего отказа от результата нужен отдельный сигнал отмены, иначе отправители могут остаться заблокированными.