先看代码:
func main() {
ch := make(chan int, 1)
for i := 0; i < 10; i++ {
select {
case x := <-ch:
fmt.Println(x)
case ch <- i:
fmt.Println("--", i)
}
}
}
为什么输出0 2 4 8?
-- 0
0
-- 2
2
-- 4
4
-- 6
6
-- 8
8
ch的buffer size是1,这个通道的状态要么是full,要么是empty
当i是0时,通道是empty,执行send,输出-- 0
当i是1时,通道是full,send阻塞,执行receive,输出0
当i是2时,通道是empty,执行send,输出-- 2
以此类推
本文通过一个Go语言中的并发代码示例,详细解析了通道(channels)的缓冲机制以及select语句如何在并发场景下工作。示例展示了当通道缓冲为1时,发送(send)和接收(receive)操作如何交替进行,并解释了为何输出结果为0248这一特定序列。
1144

被折叠的 条评论
为什么被折叠?



