for-loop - 可以在 'for .. range' 循环中的每次迭代后添加 final 语句(就像在标准 for 循环中一样)吗?

标签 for-loop go

for task := range ch {..} 循环(遍历 channel )中,我有几个地方想前进到下一个元素(continue);然而,我需要在继续之前执行一个额外的语句(设置一个标志来标记工作例程当前空闲),但在从 channel 接收到下一个元素之前 - 请参见下面的代码示例。

目前,我必须在每次 continue 之前重复此语句。这可行,但不是很优雅,worker.setIdle() 很容易被遗忘。如果我可以在循环的入口处设置这样一个“终结器”语句,那就太好了,就像您对 for task := range ch; 的期望一样。 worker.setIdle() {...} 构造,但当然这在语法上是不正确的。它就像循环中的 defer,它在每次循环迭代结束时执行,而不是在函数结束时执行。有没有办法在 Go 中表达它?

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()
}

唯一的缺点是返回语句可能会产生误导,应该对它们进行注释。关于基本 block 粒度(或整个循环粒度)的“延迟”语句会很好 :-)

最佳答案

实现此目的的一种简单方法是将循环体提取到函数中并像这样重构代码:

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

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

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

关于for-loop - 可以在 'for .. range' 循环中的每次迭代后添加 final 语句(就像在标准 for 循环中一样)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57285345/

相关文章:

go - 将数字从一个范围重新映射到另一个范围

ssl - 如何在 Go 中建立到 memsql 的基于 ssl 的 tcp 连接

mongodb - 我应该如何使用 mgo 处理 UUID 字段?

for 循环中来自 LocalForage 的 JavaScript 链式 promise

javascript - 为什么应该使用 .forEach 语法而不是 for 循环语法?

python-3.x - 使用Python银行系统以相同的名称查找多个帐户

javascript - 如果另一个 h2 选择关闭当前一个,我如何一次显示一个 h2?

c - 打印每个数字中包含 0 的数字(仅自然数)

json - 检查值是否为 typeof struct

postgresql - 插入数据库时​​如何忽略嵌入式结构字段?