channel 在使用 channel 寻找素数问题中是如何工作的?

How channel work in using channel to find prime number problem?

我有一种使用 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: %v\n", i+1, prime)
        ch = PrimeFilter(ch, prime)

    }
}

我不知道这种方法会发生什么:

By default channels are unbuffered, which states that they will only accept sends (chan <-) if there is a corresponding receive (<- chan) which are ready to receive the sent value

我无法想象上面的 Go 程序如何 运行!

谁能帮我看看前 10 个左右的围棋程序的逐步流程?

这是一个非常复杂的例子。在这两个函数中,go func(){...}() 创建一个匿名 goroutine 并异步运行它,然后 returns 从 goroutine 接收值的通道。 PrimeFilter returns 一个频道,它将接收不能被某个候选人整除的数字。

想法是 prime := <-ch 总是从通道中获取第一个元素。因此,可视化流程:

  1. GenerateNatural() 首先发送数字 2, 3, 4... 到 ch.

  2. 第一次循环迭代:

    一个。 prime := <-ch 读取第一个(质数)数 2

    b。 PrimeFilter(ch, 2)然后继续接收剩余的数字(345、...),并将不能被2整除的数字发送到输出通道。因此,PrimeFilter(ch, 2) 返回的频道将接收数字(357、...)。

    c。 ch = PrimeFilter(ch, prime) 在主函数中 将本地 ch 变量替换为上一步 PrimeFilter(ch, 2) 的输出。

  3. 第二次循环迭代:

    一个。 prime := <-ch 从当前 ch 实例中读取第一个(质数)数(第一个数是 3)。

    b。 PrimeFilter(ch, 3) 然后继续接收(已过滤的)号码,除了第一个号码(因此,579、...),并发送未发送的号码被3整除到输出通道。因此,PrimeFilter(ch, 2) 返回的通道将接收数字 5711、...,因为 9 可以被 3 整除。

    c。 ch = PrimeFilter(ch, prime) 在 main 函数中 将本地 ch 变量替换为上一步 PrimeFilter(ch, 3) 的输出。

  4. ...