美文网首页
【Go - 每日一小问: 对未初始化的的 chan 进行读写,会

【Go - 每日一小问: 对未初始化的的 chan 进行读写,会

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

    对未初始化的 chan 进行读写会有不同的行为:

    1. 对未初始化的 chan 进行读取

    • 读取操作
      • 对未初始化的 chan 进行读取操作会导致永久阻塞(deadlock),因为没有任何 goroutine 可以向这个 chan 发送数据。
      • 读取操作会一直等待,直到有数据可读,但由于 chan 未初始化,这种情况永远不会发生。

    2. 对未初始化的 chan 进行写入

    • 写入操作
      • 对未初始化的 chan 进行写入操作也会导致永久阻塞(deadlock),因为没有任何 goroutine 可以从这个 chan 读取数据。
      • 写入操作会一直等待,直到有 goroutine 读取数据,但由于 chan 未初始化,这种情况永远不会发生。

    示例

    package main
    
    func main() {
        var ch chan int // 未初始化的 chan
    
        // 读取未初始化的 chan,会导致永久阻塞
        go func() {
            val := <-ch
            println(val)
        }()
    
        // 写入未初始化的 chan,也会导致永久阻塞
        ch <- 1
    }
    
    

    为什么会这样?

    • 未初始化的 chan
      • 在 Go 中,未初始化的 chan 的零值是 nil
      • nilchan 进行读写操作会导致永久阻塞,因为没有任何 goroutine 可以与之通信。
      • 这种行为是 Go 语言设计的一部分,用于防止对未初始化的 chan 进行误操作。

    总结

    • 对未初始化的 chan 进行读取操作会导致永久阻塞,因为没有数据可读。
    • 对未初始化的 chan 进行写入操作会导致永久阻塞,因为没有 goroutine 可以读取数据。
    • 这种设计确保了程序的健壮性,防止对未初始化的 chan 进行误操作。

    相关文章

      网友评论

          本文标题:【Go - 每日一小问: 对未初始化的的 chan 进行读写,会

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