MST

星途 面试题库

面试题:Go语言中Goroutine优雅退出的常规方式

在Go语言里,假设你有一个正在运行的Goroutine,它持续监听某个通道接收数据并处理。现在要求实现这个Goroutine的优雅退出,请描述实现思路并给出示例代码。
33.8万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 引入一个用于通知退出的通道(通常是 context.Context 中的 Done 通道,这里也可以直接使用一个普通的 chan struct{})。
  2. 在监听数据的 for 循环中,使用 select 语句同时监听数据接收通道和退出通道。
  3. 当退出通道接收到信号时,跳出循环,结束 Goroutine 的运行,完成优雅退出。

示例代码

package main

import (
    "fmt"
    "time"
)

func main() {
    dataCh := make(chan int)
    exitCh := make(chan struct{})

    go func() {
        for {
            select {
            case data, ok := <-dataCh:
                if!ok {
                    // 数据通道关闭,也应退出
                    return
                }
                fmt.Println("Received data:", data)
            case <-exitCh:
                fmt.Println("Received exit signal, exiting...")
                return
            }
        }
    }()

    // 模拟发送数据
    for i := 0; i < 5; i++ {
        dataCh <- i
        time.Sleep(time.Second)
    }

    // 发送退出信号
    close(exitCh)
    time.Sleep(time.Second)
    close(dataCh)
}

在上述代码中:

  1. 定义了一个数据接收通道 dataCh 和一个退出通知通道 exitCh
  2. Goroutine 使用 select 语句监听 dataChexitCh
  3. 主函数中模拟向 dataCh 发送数据,之后向 exitCh 发送退出信号并关闭 dataChGoroutine 接收到退出信号后优雅退出。