package main import ( "fmt" "time" ) // fibonacciGenerator creates a channel that produces Fibonacci numbers func fibonacciGenerator(count int) <-chan int { ch := make(chan int) go func() { defer close(ch) a, b := 0, 1 for i := 0; i < count; i++ { time.Sleep(50 * time.Millisecond) // Simulate work for generating next number ch <- a a, b = b, a+b } }() return ch } func main() { fmt.Println("Generating first 10 Fibonacci numbers:") fibStream := fibonacciGenerator(10) // Consume numbers as they become available for num := range fibStream { fmt.Printf("Received: %d ", num) } fmt.Println("Fibonacci sequence generation complete.") // Example 2: Generating prime numbers (conceptually) primeGenerator := func(limit int) <-chan int { primes := make(chan int) go func() { defer close(primes) for num := 2; num <= limit; num++ { isPrime := true for i := 2; i*i <= num; i++ { if num%i == 0 { isPrime = false break } } if isPrime { time.Sleep(20 * time.Millisecond) // Simulate work primes <- num } } }() return primes } fmt.Println(" Generating primes up to 20:") for p := range primeGenerator(20) { fmt.Printf("Prime: %d ", p) } fmt.Println("Prime generation complete.") }