golang兩個協程交替打印1-100的奇數偶數
解法1: 兩個管道實現
奇偶攜程各自的管道,在收到通知后輸出,然后通過對方管道通知對方輸出
func main() {
ch0 := make(chan int)
ch1 := make(chan int)
go func() {
for i := 1; i < 10; i += 2 {
<-ch0
fmt.Println(i)
ch1 <- 0
}
}()
go func() {
for i := 2; i < 10; i += 2 {
<-ch1
fmt.Println(i)
ch0 <- 0
}
}()
ch0 <- 0
select {}
}
解法2: 一個管道
0空間的channel會阻塞發送/接收雙發,直到發送/接收雙發同時就緒。
所以,可以達到控制兩個協程,按照相同的步調執行。
即使,控制協程相同步調運行,還是不能控制交替打印輸出。
因此,不能在步調同步后,都有輸出。
所以,在步調相同之后,讓該輸出的協程輸出,不該輸出的協程不輸出,始終有一個協成輸出。
func main0() {
ch := make(chan int)
go func() {
for i := 1; i < 10; i += 1 {
<-ch
if i%2 == 0 {
fmt.Println(i)
}
}
}()
go func() {
for i := 1; i < 10; i += 1 {
ch <- 0
if i%2 == 1 {
fmt.Println(i)
}
}
}()
select {}
}