我有一种使用Go解决查找素数问题的方法,如下所示:
package main
import (
"fmt"
)
// Generate natural seri number: 2,3,4,...
func GenerateNatural() chan int {
ch := make(chan int)
go func() {
for i := 2; ; i++ {
ch <- i
}
}()
return ch
}
// Filter: delete the number which is divisible by a prime number to find prime number
func PrimeFilter(in <-chan int, prime int) chan int {
out := make(chan int)
go func() {
for {
if i := <-in; i%prime != 0 {
out <- i
}
}
}()
return out
}
func main() {
ch := GenerateNatural()
for i := 0; i < 100; i++ {
prime := <-ch
fmt.Printf("%v: %vn", i+1, prime)
ch = PrimeFilter(ch, prime)
}
}
我不知道这种方法会发生什么:
- 我知道不能在没有中断的情况下打印频道内容:不能打印频道内容
- 通道大小:默认缓冲通道大小为
1
,表示:
默认情况下,通道是无缓冲的,这意味着它们只会如果存在相应的接收(<-chan(,则接受发送(chan<-(准备接收发送值
我无法想象上面的Go程序是如何运行的!
有人能帮我看一下前10个数字左右的围棋程序的循序渐进的流程吗?
这是一个非常复杂的例子。在这两个函数中,go func(){...}()
创建一个匿名goroutine并异步运行它,然后返回将从goroutine接收值的通道。CCD_ 3返回一个信道,该信道将接收不可被某个候选整除的数字。
其思想是prime := <-ch
总是从信道中获取第一个元素。因此,为了可视化流程:
-
GenerateNatural()
从向ch
发送数字2、3、4…开始。 -
第一次循环迭代:
a。CCD_ 7读取第一个(素数(CCD_。
b。然后,
PrimeFilter(ch, 2)
继续接收其余的数字(3
、4
、5
…(,并将不能被2
整除的数字发送到输出通道。因此,PrimeFilter(ch, 2)
返回的信道将接收数字(3
、5
、7
…(c。主函数中的
ch = PrimeFilter(ch, prime)
现在用上一步的PrimeFilter(ch, 2)
的输出替换本地ch
变量。 -
第二次循环迭代:
a。
prime := <-ch
从当前ch
实例读取第一个(素数((该第一个数字是3
(。b。然后,
PrimeFilter(ch, 3)
继续接收(已经过滤的(数字,除了第一个数字(因此,5
、7
、9
…(,并将不能被3
整除的数字发送到输出通道。因此,PrimeFilter(ch, 2)
返回的信道将接收编号PrimeFilter
0、7
、11
。。。,因为CCD_ 33可被CCD_。c。主函数中的
ch = PrimeFilter(ch, prime)
现在用上一步的PrimeFilter(ch, 3)
的输出替换本地ch
变量。 -
。。。