Go 在使用通道查找素数问题中,通道是如何工作的?

Go 在使用通道查找素数问题中,通道是如何工作的?,go,channel,Go,Channel,我有一种解决查找素数问题的方法,方法如下: 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 }

我有一种解决查找素数问题的方法,方法如下:

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)

    }
}
主程序包
进口(
“fmt”
)
//生成自然序列号:2,3,4,。。。
func GenerateNatural()chan int{
ch:=制造(成交量)
go func(){
对于i:=2;;i++{

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


想法是,
prime:=我不明白你的问题。你是在要求某人与你一起逐步完成这段代码,解释每一行吗?@Flimzy不,我了解主要目的和功能,但我无法想象无缓冲通道如何发送和接收哪个值(go例程不是按顺序运行的).GenerateNatural和PrimeFilter都会启动同时运行的goroutine,一个正在发送,一个正在接收,主goroutine也在运行。请注意,这是一个非常复杂的示例,可以使用纸和笔查看发生了什么。这是一个非常复杂的示例。在这两个函数中,
go func(){…}()
创建一个匿名goroutine并异步运行它,然后返回通道。
PrimeFilter
返回一个通道,该通道将接收不可被某个候选者整除的数字。因为
ch=PrimeFilter(ch,prime)
在每次迭代中将新的通道实例分配给
ch
,这也意味着
prime:=
ch=PrimeFilter(ch,prime)
@Groo您是对的,这就是为什么即使在打印I(迭代器)时,我也无法对流进行成像的原因因此,主Go程序将在每个迭代器之后替换ch通道,并且不关闭任何通道,对吗?在您演示了一些步骤之后,我了解了这种方法。Tks@ThoQuach:是的,每个新通道都会创建一个引用前一个通道的闭包,因此当您达到第100个prime时,您将有100个goroutines并行运行el,每个都接收前一个发送的数据。这个程序用于说明解决查找素数问题的不同方法,但我看到它非常复杂,并且以一种低效的方式使用计算资源