go语言中的select,假设有多个case满足条件,随即执行其中一个
时间: 2024-10-21 11:14:07 浏览: 11
在Go语言中,`select`语句是一种并发原语,它允许从多个通道(channel)中接收消息。当你有一个`select`块,里面有多个`case`选项,每个`case`都关联着一个通道,只要有任何一个通道准备好发送数据(即`ready`),`select`就会随机选择一个`case`去执行相应的接收操作。这是一种非阻塞的方式,可以提高程序的并发性和响应能力。
例如:
```go
package main
import (
"fmt"
"time"
)
func worker(channel1, channel2 chan int) {
for {
select {
case value := <-channel1:
fmt.Println("Received from channel 1:", value)
case value := <-channel2:
fmt.Println("Received from channel 2:", value)
default:
fmt.Println("No message available")
}
}
}
func main() {
channel1 := make(chan int, 5)
channel2 := make(chan int, 5)
go worker(channel1, channel2)
// 发送消息到两个频道
go func() {
time.Sleep(1 * time.Second)
channel1 <- 10
}()
go func() {
time.Sleep(2 * time.Second)
channel2 <- 20
}()
// 等待一段时间再关闭通道
time.Sleep(4 * time.Second)
close(channel1)
close(channel2)
}
```
在这个例子中,`worker`函数会选择一个空闲的通道接收消息,如果有多个通道准备好了,哪个先准备好就执行哪个。
阅读全文