Go 本例中的通道是如何工作的?

Go 本例中的通道是如何工作的?,go,primes,channels,sieve,Go,Primes,Channels,Sieve,这是素数筛的一个例子 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 ma

这是素数筛的一个例子

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
  }
}
如果我删除最后3行

ch1 := make(chan int)
go Filter(ch, ch1, prime)
ch = ch1
然后所有数字都从2到11打印出来。这条线做什么ch=ch1


谢谢

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

以下是另一种对您更有意义的写作方式:

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
}
i:=0的
;i<10;i++{

prime:=并非所有数字都被打印的原因是,它在循环的每个迭代中都不是同一个通道。它创建一个新通道ch1,将ch中的值过滤到ch1中,然后将ch分配给ch1,以便下一个迭代ch是来自上一个迭代(称为ch1)的新通道并且这些值已经被过滤器goroutine过滤掉了

以下是另一种对您更有意义的写作方式:

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
}
i:=0;i<10;i++{
prime:=您的代码的输出是:

2
3
5
7
11
13
17
19
23
29
所以程序是这样的:

i=0


prime:=之后,代码的输出是:

2
3
5
7
11
13
17
19
23
29
所以程序是这样的:

i=0


prime:=Context:=之后:。也在@VonC中进行了优化,感谢链接。引用的文章缺少一个中间但重要的改进步骤。另一个重要的优化(实际上与延迟相关)是通过打开反馈环(博客提到的)。这样就可以有一个主生产通道塔,每个通道只有一个小的缓冲区(python版本-请参阅代码中的第4行).@Willenss乍一看确实不错。以下是.Context:。在@VonC中也进行了优化,谢谢你的链接。引用的文章缺少一个中间但重要的改进步骤。另一个重要的优化(与延迟相关)是通过打开反馈环(博客提到的)。这样就有可能有一个主生产通道塔,每个通道只有一个小的缓冲区(python版本-请参阅代码中的第4行)。@WillNess乍一看确实不错。下面是示例。