Go实现双线程交替打印1-100

最近在学习 Go,看到师兄在群里分享了一道他面阿里的面试题:

创建两个线程,一个线程负责打印偶数,另外一个线程打印奇数。要求:按顺序打印出 1-100。

因为我刚学 Go 不久,就想着就用 channel 实现就好了,创建 3 个信号量(channel)应该就可以解决这个问题, 可以把 channel 看成一个信号量,goroutine 进入时,首先去从channel 里读,相当于 P 操作;往 channel 写,相当于 V 操作。

  • chan1: 控制打印奇数的 goroutine
  • chan2: 控制打印偶数的 goroutine
  • final_chan: 控制主 goroutine

具体代码如下:

package main

import (
	"fmt"
)

func main() {
	chan1 := make(chan struct{}, 1)
	chan2 := make(chan struct{}, 1)
	chan_final := make(chan struct{}, 1)
	chan1 <- struct{}{}
	N := 100
	go func(N int) {
		for i := 1; i <= N; i += 2 {
			<-chan1
			fmt.Println(i)
			chan2 <- struct{}{}
		}
	}(N)
	go func(N int) {
		for i := 2; i <= N; i += 2 {
			<-chan2
			fmt.Println(i)
			if i == N {
				chan_final <- struct{}{}
			}
			chan1 <- struct{}{}

		}

	}(N)
	<-chan_final
}

当然,我看到师兄的实现貌似用到一些其他我还没了解的 Go 的知识,以后学习之后再优化一下吧!