MST

星途 面试题库

面试题:Go语言循环控制语句的高级应用

编写一个Go程序,使用for循环结合select语句实现一个简单的多路复用器。该多路复用器监听两个通道,当任意一个通道接收到数据时,将数据打印出来,并继续监听,直到其中一个通道关闭,此时程序结束。请写出完整代码,并解释select语句在循环中的作用。
36.3万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import (
    "fmt"
)

func main() {
    ch1 := make(chan int)
    ch2 := make(chan int)

    go func() {
        for i := 0; i < 5; i++ {
            ch1 <- i
        }
        close(ch1)
    }()

    go func() {
        for i := 0; i < 3; i++ {
            ch2 <- i * 2
        }
        close(ch2)
    }()

    for {
        select {
        case data, ok := <-ch1:
            if!ok {
                return
            }
            fmt.Printf("Received from ch1: %d\n", data)
        case data, ok := <-ch2:
            if!ok {
                return
            }
            fmt.Printf("Received from ch2: %d\n", data)
        }
    }
}

select语句在循环中的作用

  1. 多路监听select语句可以同时监听多个通道的操作(这里是ch1ch2),当任意一个通道有数据可读(或可写,在其他场景下)时,对应的case分支会被执行。
  2. 阻塞等待:在for循环内,select语句处于阻塞状态,直到有通道操作准备好。这意味着程序不会继续执行select之后的代码,而是等待通道上的事件发生。
  3. 公平性:当多个通道同时准备好时,select会随机选择一个case分支执行,保证每个通道都有平等的机会被处理。
  4. 检测通道关闭:通过ok变量(如data, ok := <-ch1),可以检测通道是否关闭。当通道关闭且没有数据可读时,okfalse,此时可以结束程序,避免无效读取。