golang实现N个goroutine交替打印数字

参考

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来等待。补入之后就是参考文章里的代码。

你可能感兴趣的:(golang,开发语言,后端)