pipeline
pipeline 模式,它将一系列的小命令组合成一个大的命令,它可以将***一个大命令拆分为一个一个的高内聚的小命令***,我们可以使用这一系列的小命令组合更多更复杂的命令。
下面给出一个需求,我们将这个需求写成 pipeline 的模式。
需求是:对一个 int 的切片做 “平方”,“过滤奇函数”,“求和” 的操作,并且使用 pipeline 的方式去调用这一系列的高内聚的小函数。
// 初始函数
func echo(data []int) chan int {
out := make(chan int)
go func() {
for _, v := range data {
out <- v
}
close(out)
}()
return out
}
// 平方
func sq(in chan int) chan int {
out := make(chan int)
go func() {
for v := range in {
out <- v * v
}
close(out)
}()
return out
}
// 过滤奇函数
func odd(in chan int) chan int {
out := make(chan int)
go func() {
for v := range in {
if v%2 != 0 {
out <- v
}
}
close(out)
}()
return out
}
// 求和
func sum(in chan int) chan int {
out := make(chan int)
go func() {
sum := 0
for v := range in {
sum += v
}
out <- sum
close(out)
}()
return out
}
type EchoFunction func ([]int) (<- chan int)
type PipeFunction func (<- chan int) (<- chan int)
// pipeline 处理
func Handle(a []int, e EchoFunction, ps ...PipeFunction) chan int {
ch := e(a)
for _, v := range ps {
ch = v(ch)
}
return ch
}
// main函数
func main() {
a := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
data := <-Handle(a, echo, sq, odd, sum)
fmt.Println(data)
}