Chain stages qua channels — mỗi stage là goroutine, data chảy qua channels.
go
// Stage 1: generator
func gen(nums ...int) <-chan int {
out := make(chan int)
go func() {
for _, n := range nums {
out <- n
}
close(out)
}()
return out
}
// Stage 2: transform
func square(in <-chan int) <-chan int {
out := make(chan int)
go func() {
for n := range in {
out <- n * n
}
close(out)
}()
return out
}
// Stage 3: filter
func evens(in <-chan int) <-chan int {
out := make(chan int)
go func() {
for n := range in {
if n%2 == 0 {
out <- n
}
}
close(out)
}()
return out
}
// Compose pipeline
func main() {
for result := range evens(square(gen(1, 2, 3, 4, 5))) {
fmt.Println(result) // 4, 16
}
}Fan-out: nhiều goroutines đọc cùng channel.
Fan-in: merge nhiều channels thành 1.