需求

统计 1-8000之间的素数。

思路分析

image.png

代码

  1. // goroutine + channel 求素数
  2. package main
  3. import (
  4. "fmt"
  5. )
  6. func putNum(intChan chan int) {
  7. for i := 1; i <= 800; i++ {
  8. intChan <- i
  9. }
  10. close(intChan)
  11. }
  12. func primeNum(intChan chan int, primeChan chan int, exitChan chan bool) {
  13. var flag bool
  14. for {
  15. // time.Sleep(time.Millisecond * 10)
  16. num, ok := <-intChan
  17. if !ok {
  18. break
  19. }
  20. flag = true
  21. for i := 2; i < num; i++ {
  22. if num%i == 0 {
  23. // 不是素数
  24. flag = false
  25. break
  26. }
  27. }
  28. if flag {
  29. primeChan <- num
  30. }
  31. }
  32. exitChan <- true
  33. fmt.Println("该协程退出 primeNum")
  34. }
  35. func main() {
  36. intChan := make(chan int, 1000)
  37. primeChan := make(chan int, 2000)
  38. exitChan := make(chan bool, 4)
  39. go putNum(intChan)
  40. for i := 0; i < 4; i++ {
  41. go primeNum(intChan, primeChan, exitChan)
  42. }
  43. go func() {
  44. for i := 0; i < 4; i++ {
  45. <-exitChan
  46. }
  47. close(primeChan)
  48. }()
  49. for v := range primeChan {
  50. fmt.Println("素数: ", v)
  51. }
  52. fmt.Println("主线程退出")
  53. }