【发布时间】:2018-12-19 00:22:42
【问题描述】:
我一直在学习频道,教科书的示例看起来简单易懂。但是,我无法理解以下行为。
func main() {
message := make(chan string)
message <- "ping"
fmt.Println(<-message)
}
为什么上面会导致错误?我知道我可以通过引入一个 goroutine 让发送者和接收者都准备好来使它工作。但是,如果是这样,为什么以下工作。
func main() {
message := make(chan string,1)
message <- "ping"
fmt.Println(<-message)
}
*********感谢乔·麦克马洪的回答*********
*********下面记录供我参考*********
我假设缓冲区 1(与 2 不同)也会阻塞主程序,直到找到相应的接收器。看起来 1 的缓冲区就像 0 和 1 一样工作,并且不会阻止第 0 次写入/读取的代码。为了演示使用缓冲区的块,
func main() {
message := make(chan string, 1)
message <- "ping1"
message <- "ping2"
fmt.Println(<-message) //Unreachable code.
}
【问题讨论】:
-
在第一个示例中它不起作用的原因是,当您到达
message <- "ping"行时,整个程序被阻止,因为您永远无法到达指定接收者的下一行。请记住,这都是一个 goroutine。 -
这在围棋巡回赛中有所介绍:tour.golang.org/concurrency/2
标签: go