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乍一看确实不错。下面是示例。