为了账号安全,请及时绑定邮箱和手机立即绑定

通道缓冲区在没有 goroutines 的情况下与传递给 goroutines 时如何在

通道缓冲区在没有 goroutines 的情况下与传递给 goroutines 时如何在

Go
桃花长相依 2023-05-15 15:45:59
我绝对是 Golang 的新手。我正在通过 Tour of Go 学习,然后用我自己的理解来实现想法。我在使用 goroutines 时遇到问题。我创建了一个无缓冲通道,然后向该通道发送了一个字符串。func main() {    p := make(chan string)    p <- "Hello goroutine"    fmt.Println(<-p)}抛出错误致命错误:所有 goroutines 都睡着了——死锁!我明白了,频道是无缓冲的。(这就是原因。对吧?)。但是当我重构p <- "Hello goroutine为一个 goroutine时func main() {    p := make(chan string)    go sendHello(p)    fmt.Println(<-p)}func sendHello(p chan string) {    p <- "Hello goroutine"}它可以正常工作。我读到在大多数情况下我们不需要使用带有映射、切片和通道的指针来修改值。通过具有单独缓冲区的副本传递channel p给func sendHello(p chan string)。我仍然无法理解它。
查看完整描述

1 回答

?
catspeake

TA贡献1111条经验 获得超0个赞

请记住,通道有两个端点,一个sender和一个receiver。您的问题与执行顺序有关。

在第一个示例中,当您使用无缓冲通道时,该通道需要一个接收者,而发送消息时没有接收者Hello goroutine,并等待直到有一个(缓冲通道不是这种情况,因为它不需要等待) ,并且执行永远不会到达下一行(即死锁)。

但是在第二个例子中,接收者绑定到通道,然后执行 groutine,发送者接收者都没有保持等待状态。


查看完整回答
反对 回复 2023-05-15
  • 1 回答
  • 0 关注
  • 97 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信