我绝对是戈朗的新手。我正在通过旅游学习,然后用我自己的理解实现想法。我对大猩猩有意见。我做了一个没有缓冲的频道,然后给那个频道发送了一个字符串。
func main() {
p := make(chan string)
p <- "Hello goroutine"
fmt.Println(<-p)
}抛错
致命错误:所有的猩猩都睡着了-死锁!
我明白了,频道没有缓冲。(,这就是原因。对吧?)。
但是当我把p <- "Hello goroutine重构成一个
func main() {
p := make(chan string)
go sendHello(p)
fmt.Println(<-p)
}
func sendHello(p chan string) {
p <- "Hello goroutine"
}它没有问题。我读到,我们不需要在大多数情况下使用映射、切片和通道的指针来修改值。channel p是,它通过一个具有独立缓冲区的副本传递给。我还是不能把我的头绕过去。
发布于 2018-12-17 12:27:26
请记住,频道有两个端,发送者和接收者。你的问题是执行的顺序。
在第一个示例中,当您使用一个未缓冲的通道时,通道需要一个接收方,而在发送Hello goroutine消息时没有接收方,并等待直到有一个接收方(缓冲通道不需要等待),并且执行永远不会到达下一行(即死锁)。
但是在第二个例子中,接收方被绑定到信道,然后执行发件人和接收方,并且发送方和接收方都不会停留在等待状态。
https://stackoverflow.com/questions/53814981
复制相似问题