Цепочка этапов: каждый этап - горутина, читает из входного канала, обрабатывает, пишет в выходной. Данные потоком идут по конвейеру. Классика: генератор - этап - этап - потребитель. Закрытие каналов распространяется по цепочке.
gen := func() <-chan int { ch := make(chan int); go func() { for i := 0; i < n; i++ { ch <- i }; close(ch) }(); return ch }
sq := func(in <-chan int) <-chan int { out := make(chan int); go func() { for v := range in { out <- v*v }; close(out) }(); return out }
for v := range sq(gen()) { fmt.Println(v) }