- 题目:用 N 个协程( n > =3 )顺序打印 0 - 100
协程间交互,Channel
package main
import (
"fmt"
)
func main() {
PrintInOrder(3)
}
func PrintInOrder(goroutineNum int) {
// 创建 chan Slice
chanSet := make([]chan int, goroutineNum)
// 完成信号
exitChan := make(chan bool)
for i := 0; i < goroutineNum; i++ {
// 创建 chan
chanSet[i] = make(chan int)
}
// 给最后一个 chan 写一条数据,为了第一次输出从第 1 个 chan 输出
go func() {
// 导火线
chanSet[goroutineNum-1] <- 1
}()
var result = 0 // 打印的初始值
for i := 0; i < goroutineNum; i++ {
var previousChan chan int
var nextChan chan int
if i == 0 {
// 第一个协程的上一个是最后一个协程,就形成一个循环
previousChan = chanSet[goroutineNum-1]
} else {
previousChan = chanSet[i-1]
}
nextChan = chanSet[i]
go func(i int, previousChan, nextChan chan int) {
for {
// 等待上一位的信号
<-previousChan
if result > 100 {
// 超过 100 就退出
exitChan <- true
return
}
fmt.Printf("goroutine%d: %d \n", i, result)
result = result + 1
// 给下一位信号
nextChan <- 1
}
}(i, previousChan, nextChan)
}
// 等待完成信号
<-exitChan
}