在以下代码片段中,tasks是一个长度为 30 的缓冲通道,其中填充了正好 30 个元素。我正在编写一个for循环来操作从通道中读取的每个任务。
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。当我改变这个通道的长度(这取决于我拥有的任务元素的数量)时,for 循环总是只运行len(tasks). 为什么会这样?
背景:我对任务使用缓冲通道,因为我打算在 goroutine 中执行每个任务,如果任务失败,则会处理任务。但我目前已将代码缩减为 for 循环中的选择案例,我对为什么选择案例导致 for 循环仅执行一半时间感到困惑。我确认这个for循环已经完成执行,并且在最后一次执行之后,i等于14(通道长度为30)。
侃侃无极
侃侃尔雅
慕尼黑5688855
相关分类