https://blog.csdn.net/liyunlong41/article/details/108999918
核心思想多个协程,以类似链表的形式串起来,下一个协程的输入channel是上一个协程的输出channel。每个协程不断接收上一个协程的channel传来的数据;打印完了,往下一个channel输出,触发下一个协程输出。
另外:最后一个协程输出了,应该再写入到第一个协程里,成环。
以核心思想实现的代码func TestPrintParr(t *testing.T) {
start := make(chan int)
lastCh := start
for i := 0; i < 3; i++ {
lastCh = getWorkerSimple(lastCh, i+1)
}
start <- 0
// 首尾相接,成环
for v := range lastCh {
start <- v
}
close(start)
time.Sleep(10*time.Second)
}
func getWorkerSimple(waitCh chan int, symbol int) (next chan int) {
notify := make(chan int)
go func(waitCh chan int) {
for d := range waitCh {
if d >= 30 {
break
}
fmt.Println("goroutine:", symbol, "print", d+1)
notify <- d + 1
}
close(notify)
fmt.Println("goroutine: finish", symbol)
}(waitCh)
return notify
}
核心思想就是上面的代码,但是不够优雅,是在主goroutine里sleep来等待结束,其实可以传入wg来等待。补入之后就是参考文章里的代码。