麻烦帮我理一下这个书中的示例,go 的协程,实在是理不顺了,万分感谢。
代码如下,问题:main()中for循环在不断启用新的协程,ch = ch1,这一句,它是不需要等待的吧,直接从 ch1 := make(chan int) 得到空的信道吗?
如果能讲解一下执行顺序,感激不尽,这段代码输出的是 2 3 5 7 11 13 17 19 …,能否帮我讲解下 11 是怎么得到的就行,我不清楚这中间协程和ch=ch1哪个在前在后执行的。
package main
import "fmt"
// Send the sequence 2, 3, 4, ... to channel 'ch'.
func generate(ch chan int) {
for i := 2; ; i++ {
ch <- i // Send 'i' to channel 'ch'.
}
}
func filter(in, out chan int, prime int) {
for {
i := <-in // Receive value of new variable 'i' from 'in'.
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
}
}
这个首先要理解质数产生的机理。代码的走势就是有很多个filter()协程,而且这个协程出来的第一个元素就是质数。这些filter()协程是有顺序的,像一个链式一样的关系,前一个协程写入的数据,后一个协程拿出来。prime就是前一个协程的写入的第一个元素。这是前三个协程,可以参考一下
还