MST

星途 面试题库

面试题:Go语言通道关闭读取时的错误处理优化

假设你有一个生产者 - 消费者模型,生产者向通道发送数据后关闭通道。消费者读取通道数据时,如何优雅地处理通道关闭带来的错误,同时避免资源浪费和潜在的死锁?请提供详细的代码实现和思路。
46.8万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

思路

  1. 在生产者 - 消费者模型中,生产者向通道发送完数据后关闭通道。
  2. 消费者通过for... range循环读取通道数据,当通道关闭时,for... range会自动结束,无需额外处理错误。
  3. 为避免死锁,确保生产者和消费者的资源合理分配与释放,例如在并发场景下正确使用sync.WaitGroup等同步机制。

代码实现(以Go语言为例)

package main

import (
    "fmt"
    "sync"
)

func producer(ch chan int, wg *sync.WaitGroup) {
    defer wg.Done()
    for i := 0; i < 5; i++ {
        ch <- i
    }
    close(ch)
}

func consumer(ch chan int, wg *sync.WaitGroup) {
    defer wg.Done()
    for num := range ch {
        fmt.Println("Consumed:", num)
    }
}

func main() {
    var wg sync.WaitGroup
    ch := make(chan int)

    wg.Add(2)
    go producer(ch, &wg)
    go consumer(ch, &wg)

    wg.Wait()
    close(ch) // 这里的close(ch)是多余的,因为生产者已经关闭了通道,只是为了展示完整流程
}

在上述代码中:

  • producer函数向通道ch发送数据,发送完毕后关闭通道。
  • consumer函数使用for... range读取通道数据,通道关闭时循环自动结束。
  • main函数中使用sync.WaitGroup等待生产者和消费者协程完成任务,避免程序提前退出导致死锁或资源未处理的情况。