美文网首页
【Go - 每日一小问: 对已经关闭的的 chan 进行读写,会

【Go - 每日一小问: 对已经关闭的的 chan 进行读写,会

作者: wn777 | 来源:发表于2024-08-25 21:58 被阅读0次

    对已经关闭的 chan 进行读写会有不同的行为:

    1. 对已关闭的 chan 进行读取

    • 读取操作
      • 如果 chan 中有未被读取的值,可以继续读取这些值,直到 chan 中的所有值都被读取完。
      • 一旦 chan 中的所有值都被读取完,再次读取时会立即返回零值(zero value)并且不会阻塞。
      • 读取操作可以通过第二个返回值来判断 chan 是否已关闭。
    package main
    
    import (
        "fmt"
    )
    
    func main() {
        ch := make(chan int, 2)
        ch <- 1
        ch <- 2
        close(ch)
    
        // 读取已关闭的 chan
        for i := 0; i < 3; i++ {
            val, ok := <-ch
            fmt.Printf("val: %d, ok: %v\\n", val, ok)
        }
    }
    
    

    输出:

    val: 1, ok: true
    val: 2, ok: true
    val: 0, ok: false
    
    

    2. 对已关闭的 chan 进行写入

    • 写入操作
      • 对已关闭的 chan 进行写入操作会导致运行时(panic)。
      • 这是因为关闭的 chan 不允许再写入任何值。
    package main
    
    func main() {
        ch := make(chan int, 2)
        close(ch)
    
        // 对已关闭的 chan 进行写入
        ch <- 1 // 这行代码会导致 panic
    }
    
    

    运行时会出现以下错误:

    panic: send on closed channel
    
    

    为什么会这样?

    • 读取操作
      • 设计上,读取已关闭的 chan 返回零值并且不会阻塞,这样可以让消费者知道 chan 已经关闭,并且可以继续处理剩余的值。
      • 通过第二个返回值 ok,可以判断 chan 是否已关闭,从而避免误读。
    • 写入操作
      • 设计上,关闭的 chan 不允许再写入任何值,以确保数据的一致性和完整性。
      • 试图向已关闭的 chan 写入数据会导致运行时panic,以便开发者能够及时发现和修复这种错误。

    总结

    • 对已关闭的 chan 进行读取操作会返回零值并且不会阻塞,可以通过第二个返回值判断 chan 是否已关闭。
    • 对已关闭的 chan 进行写入操作会导致运行时(panic)。
    • 这种设计确保了数据的一致性和程序的健壮性。

    相关文章

      网友评论

          本文标题:【Go - 每日一小问: 对已经关闭的的 chan 进行读写,会

          本文链接:https://www.haomeiwen.com/subject/ousokjtx.html