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
消息。然后接收器循环接收所有剩余的消息。
- 1 回答
- 0 关注
- 83 浏览
添加回答
举报
0/150
提交
取消