
在Go语言中,缓冲通道是一种特殊类型的通道,它与普通通道的行为有所不同。普通通道在发送数据时,发送者会被阻塞,直到有接收者接收数据为止。而缓冲通道则允许发送者在通道未满时继续发送数据,而不会被阻塞。这样一来,发送者可以更快地完成发送操作,而不需要等待接收者。对于Go语言的使用者来说,缓冲通道的行为可以提供更高的并发性能和更好的响应速度。
问题内容
我试图了解缓冲通道的工作原理并为其编写代码片段
package main
import (
"fmt"
)
func squares(c chan int) {
for i := 0; i < 4; i++ {
num := <-c
fmt.println(num * num)
}
}
func main() {
fmt.println("main() started")
c := make(chan int, 3)
go squares(c)
c <- 1
c <- 2
c <- 3
c <- 4 // blocks here
fmt.println("main() stopped")
}
按照我预期程序的行为方式,主 goroutine 启动并持续到 c
意思是我期望的输出是,
main() started 1 4 9 main() stopped
但是我得到了输出,
main() started 1 4 9 16 main() stopped如何?我是否遗漏了渠道到底如何运作的一些信息?
解决方法
渠道不是这样运作的。
Goroutines 并发运行。这意味着当一个 Goroutine 发送到缓冲通道时,另一个等待从该通道接收的 Goroutine 可以立即接收它。它不会等待通道填满。
至于程序的结束,当你将最后一个数字发送到通道时,不能保证 goroutine 会在程序结束之前拾取它并打印输出,因为你没有等待 goroutine完全的。因此,幸运的是,它运行并打印输出。还会有其他执行不会发生这种情况,并且程序会在 goroutine 打印输出之前终止。










