为了账号安全,请及时绑定邮箱和手机立即绑定

缓冲通道在达到其容量时不会阻塞写入

缓冲通道在达到其容量时不会阻塞写入

Go
慕勒3428872 2022-10-10 16:10:32
https://play.golang.org/p/5A-dnZVy2aAfunc closeChannel(stream chan int) {    fmt.Println("closing the channel")    close(stream)}func main() {    chanOwner := func() <-chan int {        resultStream := make(chan int, 5)        go func() {            defer closeChannel(resultStream)            for i := 0; i <= 5; i++ {                resultStream <- i            }        }()        return resultStream    }    resultStream := chanOwner()    for result := range resultStream { //this blocks until the channel is closed        fmt.Printf("Received: %d\n", result)    }    fmt.Println("done receiving")}程序输出closing the channelReceived: 0Received: 1Received: 2Received: 3Received: 4Received: 5done receiving为什么在上述程序中的closing the channel任何语句之前打印语句。Received由于通道的缓冲容量为 5,并且我们正在向其中插入 6 个元素,因此我希望它在resultStream <- i读取值并清除缓冲区中的空间之前阻塞。
查看完整描述

1 回答

?
茅侃侃

TA贡献1842条经验 获得超21个赞

生成器 goroutine 将通道填充到其容量并阻塞。循环的接收器从通道接收第一项,这再次启用生成器 goroutine。Received生成器 goroutine 在接收器 for 循环打印消息之前运行完成,打印closing the channel消息。然后接收器循环接收所有剩余的消息。



查看完整回答
反对 回复 2022-10-10
  • 1 回答
  • 0 关注
  • 83 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信