MST

星途 面试题库

面试题:Go中通道关闭后读取异常的常规处理方式

在Go语言中,当一个通道被关闭后继续读取会出现什么情况?请描述至少两种处理这种异常情况的常规方式,并举例说明。
11.8万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

在Go语言中,当一个通道被关闭后继续读取,会读到该通道类型的零值,且第二个返回值(ok)为 false

以下是两种处理这种异常情况的常规方式:

方式一:通过第二个返回值判断通道是否关闭

package main

import (
    "fmt"
)

func main() {
    ch := make(chan int)
    go func() {
        ch <- 10
        close(ch)
    }()

    for {
        data, ok := <-ch
        if!ok {
            break
        }
        fmt.Println("Received:", data)
    }
    fmt.Println("Channel is closed.")
}

在上述代码中,通过 data, ok := <-ch 接收通道数据并获取通道状态 ok,当 okfalse 时,表示通道已关闭,从而跳出循环。

方式二:使用 for... range 循环

package main

import (
    "fmt"
)

func main() {
    ch := make(chan int)
    go func() {
        ch <- 20
        close(ch)
    }()

    for data := range ch {
        fmt.Println("Received:", data)
    }
    fmt.Println("Channel is closed.")
}

这里使用 for... range 循环来读取通道数据,当通道关闭时,循环会自动结束。