MST
星途 面试题库

面试题:Go语言中使用Channel构建生产者消费者模式时,如何优雅地处理生产者结束生产的情况

在Go语言利用Channel实现生产者消费者模式的代码中,假设生产者完成数据生成后需要结束工作,同时确保消费者能够得知并正确停止消费。请描述实现该功能的思路,并给出关键代码示例。
38.3万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 生产者:生产者向 Channel 发送数据,当数据生成完毕后,关闭 Channel。关闭 Channel 是通知消费者没有更多数据的常用方式。
  2. 消费者:消费者从 Channel 接收数据时,使用 for - range 循环来读取 Channelfor - range 循环会在 Channel 关闭且所有数据都被读取完毕后自动退出,从而实现消费者的正确停止。

关键代码示例

package main

import (
    "fmt"
)

func producer(out chan<- int) {
    for i := 0; i < 5; i++ {
        out <- i
    }
    close(out)
}

func consumer(in <-chan int) {
    for val := range in {
        fmt.Println("Consumed:", val)
    }
    fmt.Println("Consumer finished")
}

func main() {
    ch := make(chan int)
    go producer(ch)
    consumer(ch)
}

在上述代码中:

  • producer 函数向 out 这个只写 Channel 发送数据,发送完成后关闭 Channel
  • consumer 函数通过 for - rangein 这个只读 Channel 接收数据,当 Channel 关闭且数据读完时,循环结束,消费者得知生产者已结束工作并停止消费。
  • main 函数创建 Channel 并启动生产者协程,然后调用消费者函数。