Fan-out — несколько горутин читают из одного канала (распределение работы). Fan-in — несколько каналов сливаются в один (сбор результатов).
// Fan-out: 3 воркера читают из jobs
jobs := make(chan int, 100)
results := make(chan int, 100)
for w := 0; w < 3; w++ {
go func() {
for job := range jobs {
results <- process(job) // fan-in в results
}
}()
}
// Отправляем задачи
for i := 0; i < 50; i++ {
jobs <- i
}
close(jobs)
Fan-in — слияние нескольких каналов:
func merge(channels ...<-chan int) <-chan int {
out := make(chan int)
var wg sync.WaitGroup
for _, ch := range channels {
wg.Add(1)
go func(c <-chan int) {
defer wg.Done()
for v := range c {
out <- v
}
}(ch)
}
go func() {
wg.Wait()
close(out)
}()
return out
}
Паттерн используется в пайплайнах обработки данных, когда один этап медленнее остальных.