duanliexi1052 2016-06-04 20:26
浏览 36
已采纳

为什么选择大小写将我的for循环切成两半?

In the following code snippet, tasks is a buffered channel of length 30 that is populated with exactly 30 elements. I'm writing a for loop to operate on each task, which is read in from a channel.

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

    }
}

fmt.Println("Done")

However, this for loop only runs from 0 to 14. When I vary the length of this channel (which depends on the number of task elements I have), the for loop always only runs for half of len(tasks). Why is this the case?

Background: I use a buffered channel for the tasks because I intend to execute each task in a goroutine, and tasks are dealt with if they fail. But I've currently cut code down to a select case in a for loop, and I'm confused about why the select case causes the for loop to only execute for half the time. I confirm that this for loop has finished executing, and that after the last execution, i is equal to 14 (channel length is 30).

  • 写回答

3条回答 默认 最新

  • duananyantan04633 2016-06-04 20:31
    关注

    len(task) decreased if you read from tasks

    Use empty for to iteratively read all from task.

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

    Or alternatively you can use range:

    for task := range tasks {
    
        fmt.Println(task)
        // Do something
    
        if len(tasks) == 0 {break}
    }
    

    Do not forget to break this cycles if you don't want to lock you goroutine.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 winform的chart曲线生成时有凸起
  • ¥15 msix packaging tool打包问题
  • ¥15 finalshell节点的搭建代码和那个端口代码教程
  • ¥15 用hfss做微带贴片阵列天线的时候分析设置有问题
  • ¥15 Centos / PETSc / PETGEM
  • ¥15 centos7.9 IPv6端口telnet和端口监控问题
  • ¥20 完全没有学习过GAN,看了CSDN的一篇文章,里面有代码但是完全不知道如何操作
  • ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录
  • ¥20 海浪数据 南海地区海况数据,波浪数据
  • ¥20 软件测试决策法疑问求解答