GO:Pipeline

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值