//产生数据
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)
}
}