Advertisement
Guest User

Untitled

a guest
Jul 21st, 2019
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.84 KB | None | 0 0
  1. package main
  2.  
  3. import "fmt"
  4.  
  5. const max = 10000
  6.  
  7. // Send the sequence 2, 3, 4, ... to returned channel
  8. func generate() chan int {
  9. ch := make(chan int)
  10. go func() {
  11. for i := 2; i < max; i++ {
  12. ch <- i
  13. }
  14. close(ch)
  15. }()
  16. return ch
  17. }
  18.  
  19. // Filter out input values divisible by 'prime', send rest to returned channel
  20. func filter(in chan int, prime int) chan int {
  21. out := make(chan int)
  22. go func() {
  23. for {
  24. i, open := <-in
  25. if !open {
  26. break
  27. }
  28. if i%prime != 0 {
  29. out <- i
  30. }
  31.  
  32. }
  33. close(out)
  34. }()
  35. return out
  36. }
  37.  
  38. func sieve() chan int {
  39. out := make(chan int)
  40. go func() {
  41. ch := generate()
  42. for {
  43. prime, open := <-ch
  44. if !open {
  45. break
  46. }
  47. ch = filter(ch, prime)
  48. out <- prime
  49. }
  50. close(out)
  51. }()
  52. return out
  53. }
  54.  
  55. func main() {
  56. primes := sieve()
  57. for {
  58. val, open := <-primes
  59. if !open {
  60. break
  61. }
  62. fmt.Println(val)
  63.  
  64. }
  65. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement