我一直在学习频道,教科书中的示例似乎简单易懂。但是,我无法理解以下行为。
func main() {
message := make(chan string)
message <- "ping"
fmt.Println(<-message)
}
为什么上述结果会导致错误?我知道我可以通过引入go例程使发送方和接收方都准备就绪来使其工作。但是,如果是这样,为什么下面的方法起作用?
func main() {
message := make(chan string,1)
message <- "ping"
fmt.Println(<-message)
}
*********感谢Joe McMahon的回答*********
*********以下文档供我参考*********
我假设缓冲区1(不同于2)也会阻塞主例程,直到找到相应的接收者为止。似乎缓冲区1的工作方式与0&1相似,并且不会阻塞第0次写/读的代码。为了演示使用缓冲区的块,
func main() {
message := make(chan string, 1)
message <- "ping1"
message <- "ping2"
fmt.Println(<-message) //Unreachable code.
}
答案 0 :(得分:5)
添加“,1” 缓冲区通道。这意味着对通道的一次写入是非阻塞的,并且主程序保留了控制权。如果未缓冲通道,则写入程序将阻塞,直到另一个goroutine获得控制并从该通道读取为止。
程序已将字符串放入缓冲的通道;它现在继续运行,从缓冲的通道中读取字符串,然后打印它,而从未阻塞。
如果您使用goroutine和无缓冲通道: