package main

import (
	"fmt"
	"sync"
)

func worker(ch <-chan int, result chan<- int) {
	defer wg.Done()
	for v := range ch {
		result <- v * v
	}
}
func produce(ch chan<- int, num int) {
	for i := 0; i < num; i++ {
		ch <- i
	}
	close(ch)
}

var wg sync.WaitGroup

func main() {
	ch := make(chan int, 1)
	result := make(chan int, 1)
	for i := 0; i < 20; i++ {
		wg.Add(1)
		go worker(ch, result)
	}
	go produce(ch, 10)
	// 等待所有 worker 完成后,关闭 result channel
	go func() {
		wg.Wait()
		close(result)
	}()
	for v := range result {
		fmt.Println(v)
	}

}