golang两个协程交替打印1-100的奇数偶数
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 {}
}