【发布时间】:2019-10-09 05:14:03
【问题描述】:
我正在尝试理解 Go 中的通道。我已经读过默认情况下发送和接收块,直到发送者和接收者都准备好。但是我们如何确定发送者和接收者的准备情况。
例如在下面的代码中
package main
import "fmt"
func main() {
ch := make(chan int)
ch <- 1
fmt.Println(<-ch)
}
程序将卡在通道发送操作上,永远等待有人读取该值。即使我们在 println 语句中有一个接收操作,它也会陷入死锁。
但是对于下面的程序
package main
import "fmt"
func main() {
ch := make(chan int)
go func () {
ch <- 1
}()
fmt.Println(<-ch)
}
整数从 goroutine 成功传递到主程序。是什么让这个程序发挥作用?为什么第二个有效但第一个无效? goroutine会造成一些差异吗?
【问题讨论】:
-
也许这篇文章会有所帮助 - medium.com/rungo/…
-
“我们如何确定发送者和接收者的准备情况” - 你不知道。您编写的代码并不关心它们的准备情况(这基本上是通道的目的,异步消息传递)。您的第一个代码死锁是因为它尝试同步进行异步消息传递,第二个代码可以工作,因为它同时发送和接收。