Паттерн fan-in пересылает значения каждого входного канала в общий выход и закрывает его после окончания всех источников. Порядок между разными потоками не фиксируется.
Слияние данных из нескольких потоков в один канал
Паттерн fan-in пересылает значения каждого входного канала в общий выход и закрывает его после окончания всех источников. Порядок между разными потоками не фиксируется.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо реализовать функцию, которая собирает данные из нескольких входных каналов и объединяет их в единый выходной канал.
Ответ
Паттерн fan-in пересылает значения каждого входного канала в общий выход и закрывает его после окончания всех источников. Порядок между разными потоками не фиксируется.
Пример для 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
}
Источники должны завершить отправку и закрыть входы, получатель — читать до конца. Для досрочной остановки нужен context и отменяемые операции канала. Функция не сортирует значения и не закрывает чужие входные каналы.