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
", 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
", 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
", 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()
}