面试题答案
一键面试package main
import (
"fmt"
)
func main() {
ch1 := make(chan int)
ch2 := make(chan int)
go func() {
ch1 <- 1
}()
go func() {
ch2 <- 2
}()
select {
case val := <-ch1:
fmt.Printf("从ch1接收到数据: %d\n", val)
case val := <-ch2:
fmt.Printf("从ch2接收到数据: %d\n", val)
}
}
代码解释
- 通道创建:创建了两个整型通道
ch1
和ch2
。 - 发送数据的 goroutine:启动了两个匿名 goroutine,分别向
ch1
发送1
,向ch2
发送2
。 - select 语句:
select
语句用于监听多个通道操作(接收或发送)。- 第一个分支:
case val := <-ch1:
,当ch1
有数据可接收时,会执行此分支,将接收到的数据赋值给val
并打印。 - 第二个分支:
case val := <-ch2:
,当ch2
有数据可接收时,会执行此分支,将接收到的数据赋值给val
并打印。
- 第一个分支:
在这个例子中,由于两个 goroutine 并发向通道发送数据,select
语句会阻塞,直到其中一个通道有数据可接收。一旦某个通道准备好,就会执行对应的 case
分支。如果多个通道同时准备好,select
会随机选择一个 case
分支执行。