1

これは素数ふるいの例です

package main

func Generate(ch chan<- int) {
  for i := 2; ; i++ {
    ch <- i
  }
}

func Filter(in <-chan int, out chan<- int, prime int) {
  for {
    i := <-in
    if i%prime != 0 {
      out <- i
    }
  }
}

func main() {
  ch := make(chan int)
  go Generate(ch)
  for i := 0; i < 10; i++ {
    prime := <-ch
    print(prime, "\n")
    ch1 := make(chan int)
    go Filter(ch, ch1, prime)
    ch = ch1
  }
}

私が理解しているのは、このコード行です

prime := <-ch

チャネルは入力を待っており、プライムに割り当てられています。では、次のステートメントが呼び出されたときにすべての数字が出力されないのはなぜですか

print(prime, "\n")

これらの最後の3行を削除すると

ch1 := make(chan int)
go Filter(ch, ch1, prime)
ch = ch1

次に、すべての数字が 2 から 11 まで出力されます。この行は ch = ch1 を何をしますか?

ありがとう

4

2 に答える 2

3

コードの出力は次のとおりです。

2
3
5
7
11
13
17
19
23
29

したがって、手順は次のようになります。

i=0,

prime := <-ch、素数=2、ch = {3};

後、関数内go Filter(ch, ch1, prime)でマークすると、チャネルは 3,4,5,6 ... になり、チャネルは 3,5,7 ... になります。Filter0Filter0inout

の後ch = ch1、ch = {3}、3,5,7 になります。

i=1,

after , prime prime := <-ch= 3, ch ={5},なぜそこ5にあるのchですか?chch1

後、関数内go Filter(ch, ch1, prime)でマークすると、チャネルは 5,7,9,11 ... になり、チャネルは 5,7,11 ... になります。Filter1Filter1inout

ch = ch1、So ch = {3}、5,7,11 になります。

i=2、同上。

それがどのように出力されました。

于 2014-08-29T08:14:52.297 に答える