MST

星途 面试题库

面试题:Go中I/O复用机制之select的使用

在Go语言中,如何使用select语句实现I/O复用,来处理多个channel的读写操作?请给出一个简单的示例代码,并解释代码的运行逻辑。
35.7万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

示例代码

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)
    }
}

代码运行逻辑

  1. 初始化通道
    • ch1 := make(chan int)ch2 := make(chan int) 创建了两个整数类型的通道 ch1ch2
  2. 启动 goroutine 向通道发送数据
    • go func() { ch1 <- 1 }() 启动一个匿名 goroutine,向 ch1 通道发送值 1
    • go func() { ch2 <- 2 }() 启动另一个匿名 goroutine,向 ch2 通道发送值 2
  3. 使用 select 语句进行 I/O 复用
    • select 语句会阻塞,直到其内部的某个 case 分支可以继续执行。在这个例子中,case value := <-ch1:case value := <-ch2: 两个分支分别尝试从 ch1ch2 通道读取数据。
    • 当任意一个通道有数据可读时,对应的 case 分支会被选中执行。例如,如果 ch1 通道先有数据可读,那么 case value := <-ch1: 分支会被执行,从 ch1 通道读取到的值会赋值给 value,并打印输出。如果 ch2 通道先有数据可读,那么 case value := <-ch2: 分支会被执行。

通过这种方式,select 语句实现了 I/O 复用,能够同时处理多个通道的读写操作,避免在单一通道操作上阻塞,提高程序的并发性能。