golang 求质数程序

目录

这个 golang 版本的求质数算法来自《THE WAY TO GO》,虽然很消耗 CPU 但是很有 golang 的特色,充分发挥了 golang 的 routine channle 的威力
后面的图是对这段程序的解释,看了图后我就理解了,但是看之前完全不能理解这段程序。

代码

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
  }

}

// 从这段代码可以体会到,chan 作为参数的时候传递的是 chan 的位置,chan 被赋值的时候也是改变的 chan 指向的位置,这个有点像是指针

// 也就是说 chan 被赋值不会关闭已经打开的 chan,只是让 chan 指向了一个新的位置。

代码算法图解

golang_prime_1.png

  算法使用了筛法求质数,质数就像流水线的商品,每一个新的质数都成为一个过滤器。下面逐步分解解释一下
ch := make(chan int)

golang_prime_2.png

go Generate(ch)

golang_prime_3.png

prime := <-ch

golang_prime_4.png

ch1 := make(chan int)

golang_prime_5.png

go Filter(ch, ch1, prime)

golang_prime_6.png

if i%prime != 0 {
	out <- i
}

golang_prime_7.png

ch = ch1

golang_prime_8.png

prime := <-ch

golang_prime_9.png

目录