// Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package main import "fmt" // Send the sequence 2, 3, 4, ... to returned channel func generate() chan int { ch := make(chan int); go func() { for i := 2; ; i++ { ch <- i; } }(); return ch; } // Filter out input values divisible by 'prime', send rest to returned channel func filter(in chan int, prime int) chan int { out := make(chan int); go func() { for { if i := <-in; i%prime != 0 { out <- i; } } }(); return out; } func sieve() chan int { out := make(chan int); go func() { ch := generate(); for { prime := <-ch; out <- prime; ch = filter(ch, prime); } }(); return out; } func main() { primes := sieve(); for { fmt.Println(<-primes); } }