为了账号安全,请及时绑定邮箱和手机立即绑定

这个例子中的通道是如何工作的?

这个例子中的通道是如何工作的?

Go
PIPIONE 2021-08-10 21:12:18
这是素数筛的一个例子package mainfunc 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  }}我理解的是这行代码prime := <-ch通道正在等待输入并分配给素数。那么,为什么在调用下一条语句时不打印所有数字print(prime, "\n")如果我删除最后 3 行ch1 := make(chan int)go Filter(ch, ch1, prime)ch = ch1那么所有的数字都从 2 到 11 打印出来。这行 ch = ch1 有什么作用?
查看完整描述

2 回答

?
不负相思意

TA贡献1777条经验 获得超10个赞

您的代码的输出是:


2

3

5

7

11

13

17

19

23

29

所以程序是这样的:


我=0,


之后prime := <-ch,素数=2,ch={3};


之后go Filter(ch, ch1, prime),标记为Filter0,在函数中Filter0channelin将是 3,4,5,6 ... 并且 channelout将是 3,5,7 ...;


之后ch = ch1,所以 ch = {3},即 3,5,7。


我=1,


之后prime := <-ch,素= 3,CH = {5},为什么会出现5在ch“因为现在?ch是ch1在最后一环;


之后go Filter(ch, ch1, prime),标记为Filter1,在函数中Filter1channelin将是 5,7,9,11 ... 并且 channelout将是 5,7,11 ...;


之后ch = ch1,所以 ch = {3},即 5,7,11。


i=2,相同。


那它怎么输出。


查看完整回答
反对 回复 2021-08-10
?
波斯汪

TA贡献1811条经验 获得超4个赞

并非所有数字都被打印的原因是因为它在循环的每次迭代中都不是同一个通道。它创建一个新通道 ch1 并将值从 ch 过滤到 ch1,然后将 ch 分配给 ch1,以便下一次迭代 ch 是来自前一次迭代(称为 ch1)的新通道,并且那里的值已被过滤器过滤协程。


这是另一种编写它的方法,可能对您更有意义:


for i := 0; i < 10; i++ {

    prime := <-ch

    print(prime, "\n")

    oldch := ch          //here oldch references the old channel

    ch = make(chan int)  //and here ch is replaced with a new channel

    go Filter(oldch, ch, prime) //and here a filter is applied to values from oldch to ch

}


查看完整回答
反对 回复 2021-08-10
  • 2 回答
  • 0 关注
  • 196 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信