0. 参考
1. 目录结构
jeffreyguan@jeguan ~/main$ tree                                                                                                                                                                
.
├── channel
│   └── woker.go
├── go.mod
└── main.go
1 directory, 3 files
2. main.go
package main
import (
	"fmt"
	"main/channel"
)
func main() {
	fmt.Println("Begin...")
	// demo1
	//channel.ChanDemo()
	//	demo2
	channel.ChanDemo2()
}
3. channel.go
package channel
import (
	"fmt"
	"time"
)
// begin: demo1
func ChanDemo() {
	var channels [10]chan int
	for i := 0; i < 10; i++ {
		channels[i] = make(chan int)
		go Worker(i, channels[i])
	}
	for i, c := range channels {
		c <- 'a' + i
	}
	time.Sleep(time.Minute)
}
func Worker(id int, c chan int) {
	for {
		fmt.Printf("Worker %d received %d\n", id, <-c)
	}
}
// end: demo1
// begin: demo2
func ChanDemo2() {
	var channels [10]chan<- int
	for i := 0; i < 10; i++ {
		channels[i] = CreateWorker(i)
	}
	for i, c := range channels {
		c <- 'a' + i
	}
	time.Sleep(time.Minute)
}
func CreateWorker(id int) chan<- int {
	c := make(chan int)
	go func() {
		fmt.Printf("Worker %d received %c\n", id, <-c)
	}()
	return c
}
// end: demo2
4. 同步
package main
import (
	"fmt"
	"time"
)
func main() {
	fmt.Println("Begin...")
	Done := make(chan bool, 1)
	go SyncWorker(Done)
	<-Done
}
func SyncWorker(done chan<- bool) {
	time.Sleep(time.Second * 2)
	done <- true
}
5. 多个channel同步
package main
import (
	"fmt"
	"sync"
)
func doWork(id int, w worker) {
	for n := range w.in {
		fmt.Printf("Worker %d received %c\n", id, n)
		
		w.done()
	}
}
type worker struct {
	in   chan int
	done func()
}
func createWorker(id int, wg *sync.WaitGroup) worker {
	w := worker{
		in:   make(chan int),
		done: func() { wg.Done() },
	}
	go doWork(id, w)
	return w
}
func chanDemo() {
	var wg sync.WaitGroup
	var workers [10]worker
	for i := 0; i < 10; i++ {
		workers[i] = createWorker(i, &wg)
	}
	wg.Add(20)
	for i, worker := range workers {
		worker.in <- 'a' + i
	}
	for i, worker := range workers {
		worker.in <- 'A' + i
	}
	wg.Wait()
}
func main() {
	chanDemo()
}