For loop 是否可以在“for.”中的每次迭代后添加最终语句。。“范围”循环(如标准for循环)?

For loop 是否可以在“for.”中的每次迭代后添加最终语句。。“范围”循环(如标准for循环)?,for-loop,go,For Loop,Go,在一个for task:=range ch{..}循环中迭代一个通道,我有几个地方想向前走到下一个continue元素;但是,在继续设置标记工作例程当前空闲的标志之前,但在从通道接收到下一个元素之前,我需要执行一个附加语句-请参阅下面的代码示例 目前,我必须在每次继续之前重复这句话。这是可行的,但不是很优雅,而且worker.setIdle很容易被忘记。如果我能在循环的入口设置这样一个finalizer语句,那就太好了,就像您期望的for task:=range ch;worker.setIdl

在一个for task:=range ch{..}循环中迭代一个通道,我有几个地方想向前走到下一个continue元素;但是,在继续设置标记工作例程当前空闲的标志之前,但在从通道接收到下一个元素之前,我需要执行一个附加语句-请参阅下面的代码示例

目前,我必须在每次继续之前重复这句话。这是可行的,但不是很优雅,而且worker.setIdle很容易被忘记。如果我能在循环的入口设置这样一个finalizer语句,那就太好了,就像您期望的for task:=range ch;worker.setIdle{…}构造,但这在语法上是不正确的。这就像循环中的延迟,在每个循环迭代结束时执行,而不是在函数结束时执行。有没有办法用围棋来表达这一点

for task := range ch {
  ...
  if (...) {
    ...
    worker.setIdle()
    continue
  }
  ...
  if (...) {
    ...
    worker.setIdle()
    continue
  }
  ...
  if (...) {
    ...
    worker.setIdle()
    continue
  }
  ...
  worker.setIdle()
}
编辑:感谢您的回复-我认为最好的解决方案或至少另一种选择可能是匿名函数,如下所示:

for task := range ch {
  func () {
    ...
    if (...) {
      ...
      return
    }
    ...
  } ()
  worker.setIdle()
}

唯一的缺点是返回语句可能具有误导性,它们可能应该被注释。关于基本块粒度或整个循环粒度的延迟语句最好是:-

实现这一点的简单方法是将循环体提取到函数中,并按如下方式重新构造代码:

for task := range ch {
  doSomething(task)
  worker.setIdle()
}

func doSomething(task Task) {
   if (...) {
     ...
     return
   }
   if (...) {
     ...
     return
   }
   ...
}

这可能导致更好地分离关注点:一个函数处理传入任务,另一个函数处理实际工作。

使用不带range子句的for循环。在环路中的通道上接收,并在通道关闭时从环路中断

for {
    worker.setIdle()
    task, ok := <-ch
    if !ok {
        break
    }
    if (...) {
       ...
       continue
    }
    ...
    if (...) {
       ...
       continue
    }
    ...
    if (...) {
       ...
       continue
    }
    ...
}

然后,您还可以在doSomething中作为延迟函数运行worker.setIdle。您是对的,我以前也有这个想法,而且fenction甚至可能是匿名的,因此它可以访问闭包变量-谢谢