Fan-in (сведение) - паттерн, при котором несколько входных каналов объединяются в один выходной. Реализация через горутину на каждый входной канал с sync.WaitGroup для корректного закрытия.
func merge(cs ...<-chan int) <-chan int {
out := make(chan int)
var wg sync.WaitGroup
wg.Add(len(cs))
for _, c := range cs {
go func(ch <-chan int) {
for v := range ch { out <- v }
wg.Done()
}(c)
}
go func() { wg.Wait(); close(out) }()
return out
}