MST

星途 面试题库

面试题:Go语言中通道关闭后如何安全读取数据

在Go语言中,当一个通道被关闭后,继续从该通道读取数据会有什么现象?请编写一段代码示例,展示如何安全地在通道关闭后读取剩余的数据。
14.3万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 继续从关闭通道读取数据的现象
    • 当从一个已关闭的通道读取数据时,如果通道中仍有未读取的数据,会正常读取这些数据。
    • 当通道中没有数据且已关闭时,读取操作会立即返回,返回值为通道类型的零值,并且第二个返回值(ok)为 false
  2. 代码示例
package main

import (
    "fmt"
)

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

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

上述代码中,在一个匿名函数中向通道 ch 发送一些数据后关闭通道。主函数通过 for { } 循环和 ok 检查来安全地读取通道关闭后剩余的数据。当 okfalse 时,说明通道已关闭且无数据可读,从而退出循环。