golang设计模式(二)流水线模式

//产生数据
func makeData(min,max int)[]int{
	data := make([]int,max-min+1)
	for i := range data{
		data[i]=min+i
	}
	return data
}
//把输入的数据通过通道传递出去
func echo(nums []int)<-chan int{
	out := make(chan int)
	go func() {
		for _,n:= range nums{
			out<-n
		}
		close(out)
	}()
	return out
}

func isPrime(v int)(b bool){
	for i:=2;i<=v/2;i++{
		if v%2==1{
			return false
		}
	}
	return true
}

func prime(in <-chan int)chan int{
	out := make(chan int)
	go func() {
		for i := range in{
			if isPrime(i){
				out<-i
			}
		}
		close(out)
	}()
	return out
}

//流水线合并
func merge(in []chan int)<-chan int{
	group := sync.WaitGroup{}
	out := make(chan int)
	for i := range in{
		go func(ch <-chan int) {
			group.Add(1)
			for c := range ch{
				out<-c
			}
			group.Done()
		}(in[i])
	}
	go func() {
		group.Wait()
		close(out)
	}()
	return out
}
func sum(in <-chan int)chan int{
	out := make(chan int)
	go func() {
		s := 0
		for n := range in{
			s += n
		}
		out<- s
		close(out)
	}()
	return out
}
/*
	先产生一个待处理的数组
	echo相当于流水线的输入
	开启5个流水线处理,每个流水线都是判断是否为质数,然后求和
	合并流水线
*/
func main(){
	data := makeData(0, 10000)
	input := echo(data)
	chs :=make([]chan int,0)
	for _ = range []int{0,1,2,3,4}{
		chs = append(chs,sum(prime(input)))
	}
	for i := range sum(merge(chs)){
		fmt.Println(i)
	}
}
posted @   故意写bug  阅读(146)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示