github.com/graybobo/golang.org-package-offline-cache@v0.0.0-20200626051047-6608995c132f/x/talks/2014/hellogophers/sieve_20090106.go (about)

     1  // +build ignore,OMIT
     2  
     3  package main
     4  
     5  // Send the sequence 2, 3, 4, ... to channel 'ch'.
     6  func Generate(ch chan <- int) {
     7  	for i := 2; ; i++ {
     8  		ch <- i  // Send 'i' to channel 'ch'.
     9  	}
    10  }
    11  
    12  // Copy the values from channel 'in' to channel 'out',
    13  // removing those divisible by 'prime'.
    14  func Filter(in chan <- int, out *<-chan int, prime int) {
    15  	for {
    16  		i := <-in;  // Receive value of new variable 'i' from 'in'.
    17  		if i % prime != 0 {
    18  			out <- i  // Send 'i' to channel 'out'.
    19  		}
    20  	}
    21  }
    22  // BREAK OMIT
    23  // The prime sieve: Daisy-chain Filter processes together.
    24  func Sieve() {
    25  	ch := make(chan int);  // Create a new channel.
    26  	go Generate(ch);       // Start Generate() as a subprocess.
    27  	for {
    28  		prime := <-ch;
    29  		print(prime, "\n");
    30  		ch1 := make(chan int);
    31  		go Filter(ch, ch1, prime);
    32  		ch = ch1
    33  	}
    34  }
    35  
    36  func main() {
    37  	Sieve()
    38  }