我绝对是 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,发送者和接收者都没有保持等待状态。
- 1 回答
- 0 关注
- 97 浏览
添加回答
举报
0/150
提交
取消