Pipeline is a pattern for sequential data processing through a chain of goroutines.
1// Generator: creates data2func generate(nums ...int) <-chan int {3 out := make(chan int)4 go func() {5 defer close(out)6 for _, n := range nums {7 out <- n8 }9 }()10 return out11}1213// Worker: processes data14func square(in <-chan int) <-chan int {15 out := make(chan int)16 go func() {17 defer close(out)18 for n := range in {19 out <- n * n20 }21 }()22 return out23}2425func filter(in <-chan int, pred func(int) bool) <-chan int {26 out := make(chan int)27 go func() {28 defer close(out)29 for n := range in {30 if pred(n) {31 out <- n32 }33 }34 }()35 return out36}3738// Usage39ch := generate(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)40squared := square(ch)41evens := filter(squared, func(n int) bool { return n%2 == 0 })4243for n := range evens {44 fmt.Println(n) // 4, 16, 36, 64, 10045}4647// With done-channel for cancellation48func genDone(done <-chan struct{}, nums ...int) <-chan int {49 out := make(chan int)50 go func() {51 defer close(out)52 for _, n := range nums {53 select {54 case out <- n:55 case <-done:56 return57 }58 }59 }()60 return out61}
Advantages: