面试题答案
一键面试- 阐述如何使用
select
语句:select
语句用于监听多个通信操作(如从通道接收数据或向通道发送数据)。- 在处理多个不同类型任务通道时,
select
会阻塞,直到其中一个通道准备好进行操作。 - 如果多个通道同时准备好,
select
会随机选择其中一个执行,这样可以公平地处理不同类型的任务,避免某个通道一直被优先处理而导致其他通道“饥饿”。
- 代码示例(以Go语言为例):
package main
import (
"fmt"
"time"
)
func main() {
dataCh := make(chan string)
timerCh := make(chan string)
// 模拟数据处理任务通道
go func() {
for {
dataCh <- "Data processing task"
time.Sleep(2 * time.Second)
}
}()
// 模拟定时任务通道
go func() {
for {
timerCh <- "Timed task"
time.Sleep(3 * time.Second)
}
}()
for {
select {
case data := <-dataCh:
fmt.Println("Received data task:", data)
case timer := <-timerCh:
fmt.Println("Received timed task:", timer)
}
}
}
在上述代码中:
- 创建了两个通道
dataCh
和timerCh
分别用于数据处理任务和定时任务。 - 两个匿名
goroutine
分别向这两个通道发送任务数据。 - 在主
for
循环中,使用select
语句监听这两个通道,当有任务到来时,相应的case
分支会被执行,从而实现对不同类型任务的高效处理。