面试题答案
一键面试Go语言中select语句在面对多个通道操作时的并发调度机制
- 随机选择:当
select
语句中有多个case
语句可以执行(例如多个通道准备好读或写)时,Go运行时会随机选择其中一个case
来执行。这确保了没有一个case
会被饥饿(始终得不到执行机会)。 - 阻塞等待:如果没有任何
case
可以立即执行,select
语句会阻塞,直到至少有一个case
可以执行。 - 默认分支:如果存在
default
分支,当没有其他case
可以立即执行时,default
分支会立即执行,而不会阻塞。
利用select实现简单多路复用场景示例
package main
import (
"fmt"
)
func main() {
ch1 := make(chan int)
ch2 := make(chan int)
go func() {
ch1 <- 10
}()
go func() {
ch2 <- 20
}()
select {
case data := <-ch1:
fmt.Println("Received from ch1:", data)
case data := <-ch2:
fmt.Println("Received from ch2:", data)
}
}
在上述示例中,我们创建了两个通道ch1
和ch2
,并在两个独立的goroutine中向通道发送数据。select
语句同时监听这两个通道,哪个通道先准备好接收数据,对应的case
就会被执行。由于两个goroutine向通道发送数据的时间不确定,select
会随机选择先准备好的通道执行。