gpt4 book ai didi

go - 为什么 select case 将我的 for 循环减半?

转载 作者:IT王子 更新时间:2023-10-29 00:49:11 26 4
gpt4 key购买 nike

在以下代码片段中,tasks 是一个长度为 30 的缓冲 channel ,其中正好填充了 30 个元素。我正在编写一个 for 循环来处理从 channel 读入的每个任务。

for i := 0; i < len(tasks); i++ {
fmt.Println(i)
select {
case task := <-tasks:
fmt.Println(task)
// Do something

}
}

fmt.Println("Done")

但是,这个 for 循环只运行从 0 到 14。当我改变这个 channel 的长度(这取决于我拥有的任务元素的数量)时,for 循环总是只运行 len(任务)。为什么会这样?

背景:我为任务使用了一个缓冲 channel ,因为我打算在一个 goroutine 中执行每个任务,如果任务失败,就会处理这些任务。但是我目前已经将代码缩减为 for 循环中的一个 select case,我对为什么 select case 导致 for 循环只执行了一半时间感到困惑。我确认这个for循环已经执行完毕,并且在最后一次执行后,i等于14( channel 长度为30)。

最佳答案

len(task) 如果您从 tasks 读取,则减少

使用空的 for 迭代地从任务中读取所有内容。

for {
select {
case task := <-tasks:
fmt.Println(task)
// Do something
}
if len(tasks) == 0 {break}
}

或者您可以使用范围:

for task := range tasks {

fmt.Println(task)
// Do something

if len(tasks) == 0 {break}
}

如果您不想锁定您的 goroutine,请不要忘记中断这个循环。

关于go - 为什么 select case 将我的 for 循环减半?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37634686/

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