面试题答案
一键面试示例代码
package main
import (
"fmt"
)
func main() {
ch1 := make(chan int)
ch2 := make(chan int)
go func() {
ch1 <- 1
}()
go func() {
ch2 <- 2
}()
select {
case value := <-ch1:
fmt.Printf("从 ch1 读取到: %d\n", value)
case value := <-ch2:
fmt.Printf("从 ch2 读取到: %d\n", value)
}
}
代码运行逻辑
- 初始化通道:
ch1 := make(chan int)
和ch2 := make(chan int)
创建了两个整数类型的通道ch1
和ch2
。
- 启动 goroutine 向通道发送数据:
go func() { ch1 <- 1 }()
启动一个匿名 goroutine,向ch1
通道发送值1
。go func() { ch2 <- 2 }()
启动另一个匿名 goroutine,向ch2
通道发送值2
。
- 使用
select
语句进行 I/O 复用:select
语句会阻塞,直到其内部的某个case
分支可以继续执行。在这个例子中,case value := <-ch1:
和case value := <-ch2:
两个分支分别尝试从ch1
和ch2
通道读取数据。- 当任意一个通道有数据可读时,对应的
case
分支会被选中执行。例如,如果ch1
通道先有数据可读,那么case value := <-ch1:
分支会被执行,从ch1
通道读取到的值会赋值给value
,并打印输出。如果ch2
通道先有数据可读,那么case value := <-ch2:
分支会被执行。
通过这种方式,select
语句实现了 I/O 复用,能够同时处理多个通道的读写操作,避免在单一通道操作上阻塞,提高程序的并发性能。