goroutine channel问题

package main

import (
    "fmt"
)

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

func Processor(origin chan int, wait chan struct{}) {
    go func() {
        prime, ok := <-origin
        if !ok {
            close(wait)
            return
        }
        fmt.Println(prime)
        out := make(chan int)
        Processor(out, wait)
        for n := range origin {
            if n%prime != 0 {
                out <- n
            }
        }
        close(out)
    }()
}

被这个函数给绕进去了,哪位大咖给解释解释?
不明白在 for n:= range origin 这行。

阅读 2.7k
2 个回答

卤煮你换个思路,假设main中的Processor(origin, wait)执行后(不考虑go 的闭包,假设他还没来得及运行),立即跑完了for 2-1000的循环,在回头看下,现在知道origin 里面是神马了吧

实际程序中应该是for没走完,第一层Processor就开始了

https://36kr.com/p/5073181.html

for n:= range origin 可以理解为对origin这个管道进行遍历。

func main() {
    origin, wait := make(chan int), make(chan struct{})
    i := 1
    Processor(i, origin, wait)
    for num := 2; num < 10; num++ {
        origin <- num
    }
    close(origin)
    <-wait
}

func Processor(i int, origin chan int, wait chan struct{}) {
    go func() {
        prime, ok := <-origin
        if !ok {
            close(wait)
            return
        }
        out := make(chan int)
        Processor(i+1, out, wait)
        for n := range origin {
            fmt.Println(i, ":", n)
            if n%prime != 0 {
                out <- n
            }
        }
        close(out)
    }()
}

对代码进行微调,执行输出:

1 : 3
1 : 4
1 : 5
2 : 5
1 : 6
1 : 7
1 : 8
1 : 9
2 : 7
2 : 9
3 : 7

可以看到以1开头的是3-9(与main中for循环对应)。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题