iis服务器助手广告
返回顶部
首页 > 资讯 > 精选 >go 通道的行为是否会根据消息发送到它的方式而改变?
  • 835
分享到

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

go语言 2024-02-09 10:02:37 835人浏览 独家记忆
摘要

PHP小编小新在Go语言中,通道是一种用于在goroutine之间传递数据的机制。通道的行为取决于消息发送到它的方式。当通道被声明为有缓冲的时候,发送消息的goroutine会将消息放

PHP小编小新在Go语言中,通道是一种用于在goroutine之间传递数据的机制。通道的行为取决于消息发送到它的方式。当通道被声明为有缓冲的时候,发送消息的goroutine会将消息放入通道的缓冲区,然后继续执行。而当通道被声明为无缓冲的时候,发送消息的goroutine会阻塞,直到有其他goroutine从通道中接收消息。因此,可以说通道的行为会根据消息发送到它的方式而改变。

问题内容

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

  1. 运行以下代码会返回 fatal 错误:所有 goroutine 都在休眠 - 死error。
func main() {
    ch := make(chan int)
    ch <- 1
    fmt.println(<-ch)
}
  • 正确运行以下代码会返回 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 通道的行为是否会根据消息发送到它的方式而改变?的详细内容,更多请关注编程网其它相关文章!

    --结束END--

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

    本文链接: https://www.lsjlt.com/news/562408.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作