MST

星途 面试题库

面试题:Go语言通道异常处理之中断场景

在Go语言中,假设你有一个使用通道进行数据传递的生产者 - 消费者模型。生产者向通道发送数据,消费者从通道接收数据。现在要求在生产者出现异常(例如网络请求失败)时,能够安全地关闭通道并通知消费者停止接收,你会如何实现?请给出具体代码示例。
38.6万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import (
    "fmt"
    "time"
)

func producer(dataCh chan int, errCh chan error) {
    defer close(dataCh)
    for i := 0; i < 10; i++ {
        if i == 5 { // 模拟网络请求失败异常
            errCh <- fmt.Errorf("network request failed at %d", i)
            return
        }
        dataCh <- i
        time.Sleep(time.Millisecond * 100)
    }
}

func consumer(dataCh chan int, errCh chan error) {
    for {
        select {
        case data, ok := <-dataCh:
            if!ok {
                fmt.Println("channel closed, consumer stopped")
                return
            }
            fmt.Printf("Received data: %d\n", data)
        case err := <-errCh:
            fmt.Printf("Producer error: %v, consumer stopped\n", err)
            return
        }
    }
}

func main() {
    dataCh := make(chan int)
    errCh := make(chan error)

    go producer(dataCh, errCh)
    go consumer(dataCh, errCh)

    time.Sleep(time.Second * 2)
}