在多个并发协程中,可以使用select同时监听多个通道的数据。例如:
package main
import (
"fmt"
)
func main() {
ch1 := make(chan int)
ch2 := make(chan int)
go func() {
for i := 0; i < 5; i++ {
ch1 <- i
}
}()
go func() {
for i := 5; i < 10; i++ {
ch2 <- i
}
}()
for i := 0; i < 10; i++ {
select {
case x := <-ch1:
fmt.Printf("Received %d from ch1\n", x)
case x := <-ch2:
fmt.Printf("Received %d from ch2\n", x)
}
}
}
在上面的代码中,我们创建了两个通道ch1和ch2,并在两个不同的并发协程中往通道中发送数据。然后,在主协程中使用select同时监听两个通道,只有一个通道中有数据时,就会执行对应的代码块。
我们将代码改为使用多个并发协程同时监听同一个通道:
package main
import (
"fmt"
"time"
)
func main() {
ch := make(chan int)
go func() {
for i := 0; i < 5; i++ {
ch <- i
}
}()
go func() {
for i := 5; i < 10; i++ {
ch <- i
}
}()
go func() {
for {
select {
case x := <-ch:
fmt.Printf("Received %d\n", x)
}
}
}()
time.Sleep(time.Second)
}
在上面的代码中,我们创建了一个通道ch,并在两个不同的并发协程中往通道中发送数据。然后,我们创建一个新的并发