请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

对于通道的理解有点绕

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的值的原因吗?

正在回答 回答被采纳积分+3

1回答

ccmouse 2020-05-27 22:19:19

他有很多个goroutine,第一个generate,里面的值是2,3,4,5....99,这些数据全部送到第二个goroutine

第二个开始都是filter,第二个里面是去掉了2的倍数的:3,5,7,9...99,这些数据全部送到第三个goroutine

第三个里面是去掉了3的倍数的,5,7,11,13,17...,这些数据全部送到第四个goroutine

第四个里面是去掉了5的倍数的,7,11,13,17...,这些数据全部送到第五个goroutine

。。。


1 回复 有任何疑惑可以回复我~
  • 提问者 无谓1024 #1
    所以关键就是ch1的作用,在每一次循环都重新make一个的ch1,去和下一个fitter形成通道。
    回复 有任何疑惑可以回复我~ 2020-05-27 22:42:27
  • 提问者 无谓1024 #2
    所以虽然开启了很多goroutine,但是每个goroutine都有自己的primt,而当前待处理数据就是上一个goroutine取余后的结果,
    回复 有任何疑惑可以回复我~ 2020-05-27 22:51:20
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信