新手问题 协程代码不解

lik0914 · 2018年02月24日 · 最后由 小火箭 回复于 2018年02月24日 · 458 次阅读
package main

import "fmt"

func main() {
    origin, wait := make(chan int, 0), make(chan struct{}, 0)
    Processor(origin, wait)
    for num := 2; num < 1000; num++ {
        origin <- num
    }
    close(origin)
    <-wait
    fmt.Println("end.")
}

func Processor(seq chan int, wait chan struct{}) {
    go func() {
        prime, ok := <-seq
        if !ok {
            close(wait)
        }
        /*prime := <-seq
        defer close(wait)*/
        fmt.Println(prime)
        out := make(chan int)
        Processor(out, wait) // 此处为什么要在递归调用一次呢
        for num := range seq {
            if num%prime != 0 {
                out <- num
            }
        }
        close(out)
    }()
}

对于以上代码是看文章 https://36kr.com/p/5073181.html 中的代码 代码中,为什么还要再一次调用 Processor 一次呢

更多原创文章干货分享,请关注公众号
  • 加微信实战群请加微信(注明:实战群):gocnio

原文里面有个图:

Go质素并发计算

每一次Processor函数的递归调用,就是将过滤的层树往下再推进一层

跟着文章的这个图理解:

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册