package main import ( "fmt" "sync" "time" ) // generateNumbers sends numbers from start to start+count to the output channel. func generateNumbers(name string, start, count int, out chan<- int) { for i := 0; i < count; i++ { num := start + i fmt.Printf("%s: Sending %d ", name, num) out <- num time.Sleep(time.Millisecond * time.Duration(100+num%50)) } } // fanIn merges multiple input channels into a single output channel. func fanIn(done <-chan struct{}, channels ...<-chan int) <-chan int { var wg sync.WaitGroup out := make(chan int) output := func(c <-chan int) { defer wg.Done() for n := range c { select { case out <- n: case <-done: return } } } wg.Add(len(channels)) for _, c := range channels { go output(c) } go func() { wg.Wait() close(out) }() return out } func main() { gen1 := make(chan int) gen2 := make(chan int) gen3 := make(chan int) done := make(chan struct{}) // Signal to stop fanIn if needed go func() { defer close(gen1); generateNumbers("Gen1", 0, 5, gen1) }() go func() { defer close(gen2); generateNumbers("Gen2", 100, 4, gen2) }() go func() { defer close(gen3); generateNumbers("Gen3", 200, 6, gen3) }() // Merge the output of all generators into a single channel merged := fanIn(done, gen1, gen2, gen3) fmt.Println(" --- Merged Results ---") for num := range merged { fmt.Printf("Received: %d ", num) } fmt.Println("All data merged and processed.") }