1. 程式人生 > 其它 >Golang 面試題 (1) 用協程交替列印奇偶數

Golang 面試題 (1) 用協程交替列印奇偶數

Golang 面試題 (1) 用協程交替列印奇偶數

面試神策資料時,有被問到,答得不太好,記錄一下

方法1

  • 兩個G,分別列印奇數和偶數
  • 無緩衝channel通知這兩個G,控制列印順序
var flagChan=make(chan int)

func wokr1(){
	for i:=1;i<=100;i++{
		flagChan <- 1 //塞入
		if i%2==1{
			fmt.Println(i)
		}
	}
}

func wokr2(){
	for i:=1;i<=100;i++{
		_= <- flagChan // 取出
		if i%2==0{
			fmt.Println(i)
		}
	}
}


func main() {
	go wokr1()
	go wokr2()

	time.Sleep(3*time.Second)
}

方法2:

  • 一個channel儲存要列印的資料
  • 一個channel通知兩個協程列印
  • 注意:採用的是無緩衝channel,不能採用快取大小為1的channel,因為無限快取的channle塞入時會一直阻塞,知道在另一個G中被取,同樣,取也會一直阻塞,直到在另一個G中被塞入
var flagChan=make(chan int)
var ch=make(chan int,100)

func wokr1(){
	for{
		flagChan <- 1 //塞入
		x:= <- ch
		fmt.Println(x)
	}
}

func wokr2(){
	for {
		_= <- flagChan // 取出
		y:=<-ch
		fmt.Println(y)
	}
}


func main() {
	for i:=1;i<=100;i++{
		ch <- i
	}
	go wokr1()
	go wokr2()

	time.Sleep(3*time.Second)
}

注意:G之間的同步請採用無緩衝的channel,不要採用有緩衝的channel