猿问

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

我绝对是 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)。我仍然无法理解它。


桃花长相依
浏览 98回答 1
1回答

catspeake

请记住,通道有两个端点,一个sender和一个receiver。您的问题与执行顺序有关。在第一个示例中,当您使用无缓冲通道时,该通道需要一个接收者,而发送消息时没有接收者Hello goroutine,并等待直到有一个(缓冲通道不是这种情况,因为它不需要等待) ,并且执行永远不会到达下一行(即死锁)。但是在第二个例子中,接收者绑定到通道,然后执行 groutine,发送者和接收者都没有保持等待状态。
随时随地看视频慕课网APP

相关分类

Go
我要回答