Golang 面試題 (1) 用協程交替列印奇偶數
阿新 • • 發佈:2022-04-08
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