登录
首页 >  Golang >  Go问答

go 通道的行为是否会根据消息发送到它的方式而改变?

来源:stackoverflow

时间:2024-04-07 13:57:29 488浏览 收藏

各位小伙伴们,大家好呀!看看今天我又给各位带来了什么文章?本文标题《go 通道的行为是否会根据消息发送到它的方式而改变?》,很明显是关于Golang的文章哈哈哈,其中内容主要会涉及到等等,如果能帮到你,觉得很不错的话,欢迎各位多多点评和分享!

问题内容

为什么这两段代码的执行方式不同?

  1. 运行以下代码会返回 fatal 错误:所有 goroutine 都在休眠 - 死锁!error。
func main() {
    ch := make(chan int)
    ch <- 1
    fmt.println(<-ch)
}
  1. 正确运行以下代码会返回 2 和 3(各占一行)。
ch := make(chan int)
    go buffer(ch)
    fmt.Println(<-ch)
    fmt.Println(<-ch)
}

func buffer(ch chan int) {
    ch <- 2
    ch <- 3
}

仅当 ch 被定义为缓冲通道时,#1 才能正确执行。为什么?为什么 buffer() 中的 ch 接受 2 个值而不抱怨?


正确答案


对无缓冲通道的发送操作将阻塞,直到另一个 goroutine 从中读取数据。这就是第一段代码死锁的原因:当您发送到通道时,没有其他 goroutine 从中读取。

在第二种情况下,您有一个 goroutine 向通道发送两个值,并且主 goroutine 在发送的同时从通道读取两次。该通道不接受两次发送,而是一个接一个地进行,第一个发送操作由第一次读取解除阻塞,第二个发送操作由第二次读取解除阻塞。

到这里,我们也就讲完了《go 通道的行为是否会根据消息发送到它的方式而改变?》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>