用channels来协调goroutines之间的运行顺序
package main
import (
"fmt"
"sync"
)
var limit = 20
var wg sync.WaitGroup
var done chan string = make(chan string)
func main() {
c1, c2, c3 := make(chan string), make(chan string), make(chan string)
num := 1
for i := 0; i < 3; i++ {
wg.Add(1)
if i == 0 {
go print(i+1, &num, c3, c1)
} else if i == 1 {
go print(i+1, &num, c1, c2)
} else {
go print(i+1, &num, c2, c3)
}
}
c3 <- "hello"
wg.Wait()
}
func print(id int, num *int, inChan <-chan string, outChan chan<- string) {
defer wg.Done()
for {
select {
case <-inChan:
fmt.Printf("goroutine id %d prints %d\n", id, *num)
(*num)++
if (*num) == limit+1 {
close(done)
return
}
outChan <- "hello"
case <-done:
return
}
}
}