For loop 是否可以在“for.”中的每次迭代后添加最终语句。。“范围”循环(如标准for循环)?
在一个for task:=range ch{..}循环中迭代一个通道,我有几个地方想向前走到下一个continue元素;但是,在继续设置标记工作例程当前空闲的标志之前,但在从通道接收到下一个元素之前,我需要执行一个附加语句-请参阅下面的代码示例 目前,我必须在每次继续之前重复这句话。这是可行的,但不是很优雅,而且worker.setIdle很容易被忘记。如果我能在循环的入口设置这样一个finalizer语句,那就太好了,就像您期望的for task:=range ch;worker.setIdle{…}构造,但这在语法上是不正确的。这就像循环中的延迟,在每个循环迭代结束时执行,而不是在函数结束时执行。有没有办法用围棋来表达这一点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 {
...
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甚至可能是匿名的,因此它可以访问闭包变量-谢谢