Pipeline 是可以用来在系统中形成抽象的另一种工具。特别是当程序需要流式处理或批处理数据时,他是一个非常强大的工具。
Pipeline只不过是一系列将数据输入,执行操作并将结果传回的系统。我们成这些操作是Pipeline的一个stage。
Pipeline stage的属性是:
A、一个输入的参数与返回值类型相同的stage
B、一个stage必须通过变化才能语言进行“实化”之后才能被当做参数四处传递。GO语言中的函数就是一种“实化”并且很好地贴合我们的需求。
注释:据说GO语言中的函数是同的,因为你可以定义具有函数签名类型的变量。这也意味着你可以在程序中传递函数。
channel非常适合再去爱Go语言中构建pipeline。
import (
"fmt"
)
func main(){
generator :=func(done <-chan interface{},intergers...int)<-chan int{
intStream := make(chan int)
go func (){
defer close(intStream)
for _,i := range intergers{
select{
case<-done:
return
case intStream <- i:
}
}
}()
return intStream
}
multiply := func(done <-chan interface{},intStream <-chan int,multiplier int,)<-chan int{
multipliedStream := make(chan int)
go func (){
defer close(multipliedStream)
for i := range intStream{
select{
case <-done:
return
case multipliedStream <- i*multiplier:
}
}
}()
return multipliedStream
}
add := func(done <-chan interface{},intStream <-chan int,additive int)<-chan int{
addedStream := make(chan int)
go func(){
defer close(addedStream)
for i :=range intStream{
select{
case <-done:
return
case addedStream <- i+additive:
}
}
}()
return addedStream
}
done :=make(chan interface{})
defer close(done)
intStream := generator(done,1,2,3,4)
pipeline:=multiply(done,add(done,multiply(done,intStream,2),1),2)
for v := range pipeline{
fmt.Println(v)
}
}
输出:
6
10
14
18

被折叠的 条评论
为什么被折叠?



