MST

星途 面试题库

面试题:Go通道关闭后如何实现优雅的数据消费

假设你有一个生产者 - 消费者模型,生产者向通道发送数据,当生产者完成任务并关闭通道后,消费者如何确保能正确消费完通道内剩余的数据,且避免无效的接收操作?请给出具体实现思路和代码示例。
14.6万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 实现思路
    • 消费者通过for... range循环从通道接收数据。for... range会在通道关闭且通道内数据全部消费完时自动退出循环,从而确保能正确消费完通道内剩余的数据,同时避免无效的接收操作。
  2. 代码示例(以Go语言为例)
package main

import (
    "fmt"
)

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

func consumer(ch chan int) {
    for num := range ch {
        fmt.Println("Consumed:", num)
    }
}

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

在上述代码中:

  • producer函数向通道ch发送0到4的数据,然后关闭通道。
  • consumer函数使用for... range从通道ch接收数据,在通道关闭且数据消费完后,for... range循环自动结束,不会有无效的接收操作。
  • main函数启动producer协程,并调用consumer函数。