我学习了 Go 中的缓冲通道,但有些魔法对我来说是隐藏的。我有这个代码package mainimport ( "fmt")func write(ch chan int) { for i := 1; i <= 5; i++ { ch <- i fmt.Printf("Channel's length is %d\n", len(ch)) } close(ch)}func main() { ch := make(chan int, 2) go write(ch) for v := range ch { fmt.Println(v) }}输出是Channel's length is 0Channel's length is 1Channel's length is 21234Channel's length is 2Channel's length is 05为什么 write goroutine 中第一次迭代的通道长度为零?我不知道什么?
1 回答
喵喵时光机
TA贡献1846条经验 获得超7个赞
根据 GO 缓冲区的概念,您可以根据定义的缓冲区大小将元素推送到通道中(在您的情况下为 2)。但当一个元素被推入通道时,主 GO 例程正在读取相同的元素,这导致通道大小减小到零。因此,如果您在读取语句之前花一些时间。睡眠,您将得到预期的结果。
`
package main
import (
"fmt"
"time"
)
func write(ch chan int) {
for i := 1; i <= 5; i++ {
ch <- i
fmt.Printf("Channel's length is %d\n", len(ch))
}
close(ch)
}
func main() {
ch := make(chan int, 2)
go write(ch)
time.Sleep(2*time.Second)
for v := range ch {
fmt.Println(v)
time.Sleep(2*time.Second)
}
}`
上述代码的输出是:
通道长度为1
通道长度为2
1
通道长度为2
2
通道长度为2
3
通道长度为2
4
5
- 1 回答
- 0 关注
- 88 浏览
添加回答
举报
0/150
提交
取消