package main import ( "fmt" "sync" "time" ) // simulate an intensive task func processData(id int, data int) int { time.Sleep(time.Duration(data) * 50 * time.Millisecond) // Simulate work fmt.Printf("Worker %d processed data %d ", id, data) return data * 2 // Example transformation } func fanOutFanIn() { inputData := []int{10, 2, 8, 5, 12, 3, 7, 9} numWorkers := 3 inputChan := make(chan int) outputChan := make(chan int) var wg sync.WaitGroup // Fan-out: Start workers for i := 0; i < numWorkers; i++ { wg.Add(1) go func(workerID int) { defer wg.Done() for data := range inputChan { result := processData(workerID, data) outputChan <- result } }(i) } // Send data to input channel go func() { for _, data := range inputData { inputChan <- data } close(inputChan) }() // Collect results (Fan-in) go func() { wg.Wait() // Wait for all workers to finish close(outputChan) }() var results []int for res := range outputChan { results = append(results, res) } fmt.Printf("Aggregated Results: %v ", results) } func main() { fmt.Println("Starting Fan-out/Fan-in example...") fanOutFanIn() }