gpt4 book ai didi

go - 添加元素后 channel 长度为零

转载 作者:数据小太阳 更新时间:2023-10-29 03:47:10 24 4
gpt4 key购买 nike

我学习了 Go 中的缓冲 channel ,并且对我隐藏了一些魔法。我有这个代码

package main

import (
"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 0
Channel's length is 1
Channel's length is 2
1
2
3
4
Channel's length is 2
Channel's length is 0
5

为什么 write goroutine 第一次迭代时 channel 的长度为零?我不知道什么?

最佳答案

根据 GO 缓冲区的概念,您可以根据定义的缓冲区大小(在您的情况下为 2)将元素推送到 channel 中。但是当一个元素被插入 channel 时,主 GO 例程正在读取相同的元素,这导致 channel 的大小减小到零。因此,如果您在阅读语句之前花一些时间。 sleep ,您将获得预期的结果。

`

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)
}
}`
上述代码的

输出是:

Channel's length is 1

Channel's length is 2

1

Channel's length is 2

2

Channel's length is 2

3

Channel's length is 2

4

5

关于go - 添加元素后 channel 长度为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57975613/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com