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

发布于 2022-09-11 22:18:28 字数 821 浏览 35 评论 0

看到一个代码片段:

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以内的所有素数,怎么理解这段代码——具体是怎么跑的?一个个就把值筛出来了

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

表情可笑 2022-09-18 22:18:28

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


// 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)
    }()
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文