package main
import "fmt"
// Send the sequence 2, 3, 4, ... to channel 'ch'.
func generate(ch chan int) {
for i := 2; i < 100; i++ {
ch <- i // Send 'i' to channel 'ch'.
}
}
// Copy the values from channel 'in' to channel 'out',
// removing those divisible by 'prime'.
func filter(in, out chan int, prime int) {
for {
i := <-in // Receive value of new variable 'i' from 'in'.
fmt.Printf("i=%d prime=%d ", i, prime)
if i%prime != 0 {
out <- i // Send 'i' to channel 'out'.
}
}
}
// The prime sieve: Daisy-chain filter processes together.
func main() {
ch := make(chan int) // Create a new channel.
go generate(ch) // Start generate() as a goroutine.
for {
prime := <-ch
fmt.Print(prime, " ", "
")
ch1 := make(chan int)
go filter(ch, ch1, prime)
ch = ch1
}
}
输出结果:
2
i=3 prime=2 3
i=4 prime=2 i=5 prime=2 i=5 prime=3 5
i=6 prime=2 i=7 prime=2 i=7 prime=3 i=7 prime=5 7
i=8 prime=2 i=9 prime=2 i=9 prime=3 i=10 prime=2 i=11 prime=2 i=11 prime=3 i=11 prime=5 i=11 prime=7 11
i=12 prime=2 i=13 prime=2 i=13 prime=3 i=13 prime=5 i=13 prime=7 i=13 prime=11 13
i=14 prime=2 i=15 prime=2 i=15 prime=3 i=16 prime=2 i=17 prime=2 i=17 prime=3 i=17 prime=5 i=17 prime=7 i=17 prime=11 i=17 prime=13 17
`
为什么在重新进入fiter的方法时,会重新使用之前的prime值
是因为之前开的goroutine还存在,而每个goroutine的prime是不同的,并且都接收每一轮i的值的原因吗?