MST

星途 面试题库

面试题:Go语言select语句在并发编程中的应用场景

假设你有多个通道(channel)用于接收不同类型的任务,比如一个通道接收数据处理任务,另一个通道接收定时任务。请阐述如何使用select语句来高效地处理这些不同类型的任务,并且编写代码示例。
47.2万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 阐述如何使用 select 语句
    • select 语句用于监听多个通信操作(如从通道接收数据或向通道发送数据)。
    • 在处理多个不同类型任务通道时,select 会阻塞,直到其中一个通道准备好进行操作。
    • 如果多个通道同时准备好,select 会随机选择其中一个执行,这样可以公平地处理不同类型的任务,避免某个通道一直被优先处理而导致其他通道“饥饿”。
  2. 代码示例(以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)
        }
    }
}

在上述代码中:

  • 创建了两个通道 dataChtimerCh 分别用于数据处理任务和定时任务。
  • 两个匿名 goroutine 分别向这两个通道发送任务数据。
  • 在主 for 循环中,使用 select 语句监听这两个通道,当有任务到来时,相应的 case 分支会被执行,从而实现对不同类型任务的高效处理。