gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 03:45:46 24 4
gpt4 key购买 nike

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com