golang 使用无缓冲channel 多个goroutine,打印 1000 以内所有素数

看到一个代码片段:

package main

import (
    "fmt"
)

func main() {
    origin,wait := make(chan int),make(chan struct{})

    Processor(origin,wait)

    for i:=2;i<10 ;i++  {
        origin <- i
    }
    close(origin)
    <-wait
}

func Processor(seq chan int,wait chan struct{})  {
    go func() {
        prime,ok := <- seq
        // 结束
        if !ok{
            close(wait)
            return
        }
        fmt.Println(prime)

        out := make(chan int)

        Processor(out,wait)

        for num := range seq{
            if num % prime!=0{
                out<- num
            }
        }
        close(out)
    }()
}

补充说明:
要找出10000以内所有的素数,这里使用的方法是筛法,即从2开始每找到一个素数就标记所有能被该素数整除的所有数。直到没有可标记的数,剩下的就都是素数。

改为找出10以内的所有素数,怎么理解这段代码——具体是怎么跑的?一个个就把值筛出来了

阅读 3.3k
1 个回答

这个代码还是很好理解的,给你加个注释:


// seq 剩余需要筛选的所有数字, seq 中的规律是,1. 数字是由小到大的,2seq 第一个数一定为质数 (因为比它小的数,都不能整除)
// wait 等待结束的标识
func Processor(seq chan int,wait chan struct{})  {
    go func() {
        // seq 中,第一个数字一定为质数
        prime,ok := <- seq
        // 结束
        if !ok{
            close(wait)
            return
        }
        
        // 打印质数
        fmt.Println(prime)

        out := make(chan int)

        // 递归调用, out 的数据后面的for 循环传入
        Processor(out,wait)

        // 关键所在, 将比 prime 大的所有数都筛一遍,把能整除prime 的数字过滤,剩余数字有上面的递归调用处理。 
        for num := range seq{
            if num % prime!=0{
                out<- num
            }
        }
        close(out)
    }()
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题