2,190
社区成员
发帖
与我相关
我的任务
分享
package main
func Generate(ch chan<- int) {
for i := 2; ; i++ {
ch <- i
}
}
func Filter(in <-chan int, out chan<- int, prime int) {
for {
i := <-in
if i%prime != 0 {
out <- i
}
}
}
func main() {
ch := make(chan int)
go Generate(ch)
for i := 0; i < 10; i++ {
prime := <-ch
print(prime, "\n")
ch1 := make(chan int)
go Filter(ch, ch1, prime)
ch = ch1
}
}
输出结果
2
3
5
7
11
13
17
19
23
29
for i := 0; i < 10; i++ {
prime := <-ch
print(prime, "\n")
ch1 := make(chan int)
go Filter(ch, ch1, prime)
ch = ch1
}
ch = ch1很关键,语句的直接含义是,把ch1的值复制给ch,此后,对ch的读写等同对ch1的读写。
假设ch一开始是编号为0,ch1编号为1,go Filter(ch, ch1, prime)里面,从编号为0的chan读,然后写入编号为1的chan,
第一次循环结束的时候,把ch的编号改为1,然后下一轮迭代开始的时候,ch1 := make(chan int) 创建了编号为2的chan,
此后的go Filter(ch, ch1, prime)恰好吧编号为1的chan作为输入,把编号为2的chan作为输出,循环迭代下去,效果就是
routine1,从0读,写入1
routine2,从1读,写入2
routine3,从2读,写入3
routine4,从3读,写入4
............
所有的routine就窜起来了