3 回答
TA贡献2051条经验 获得超10个赞
len(task) 如果您阅读,则减少 tasks
使用 emptyfor迭代地从任务中读取所有内容。
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}
}
break如果你不想锁定你的 goroutine,不要忘记这个循环。
TA贡献1801条经验 获得超16个赞
len(tasks)在每次迭代中重新评估。所以值是 30,然后是 29,然后是 28,......最后,在中间len(tasks)交叉i,这就是为什么它只打印一半的值。
因此,您可以做的是将长度存储在变量中:
n := len(tasks)
for i := 0; i < n; i++ { ... }
或者,你可以简单地写
for len(tasks) > 0 { ... }
如果你想消耗所有元素,range操作符可以工作:
for task := range tasks { ... }
另外,请记住在使用完频道后关闭频道。
TA贡献1848条经验 获得超2个赞
因为你从通道中获取元素,它的长度减少了。看看这个样本,我想你会很清楚:https:
//play.golang.org/p/TC3HymIlhs
- 3 回答
- 0 关注
- 178 浏览
添加回答
举报