MST

星途 面试题库

面试题:Go语言通道关闭后读取行为的复杂场景

假设有一个生产者 - 消费者模型,生产者向通道写入数据后关闭通道。消费者在读取数据过程中,如何优雅地处理通道关闭,同时确保所有数据都被处理,并且不会出现死锁或数据丢失的情况?请编写完整的Go代码实现该场景。
14.8万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
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 {
        data, ok := <-ch
        if!ok {
            break
        }
        fmt.Printf("Consumed: %d\n", data)
    }
    fmt.Println("All data consumed.")
}

func main() {
    ch := make(chan int)
    go producer(ch)
    consumer(ch)
}
  1. 生产者函数producer 函数向通道 ch 写入数据,写完后关闭通道。
  2. 消费者函数consumer 函数通过 for { data, ok := <-ch } 这种方式读取通道数据,当 okfalse 时,表示通道已关闭,此时退出循环,确保所有数据都被处理且不会出现死锁或数据丢失。
  3. 主函数:在 main 函数中创建通道,启动生产者协程,然后调用消费者函数处理数据。