登录
首页 >  Golang >  Go问答

可以在“for .. range”循环中添加最终语句吗?

来源:stackoverflow

时间:2024-02-23 23:33:23 471浏览 收藏

小伙伴们对Golang编程感兴趣吗?是否正在学习相关知识点?如果是,那么本文《可以在“for .. range”循环中添加最终语句吗?》,就很适合你,本篇文章讲解的知识点主要包括。在之后的文章中也会多多分享相关知识点,希望对大家的知识积累有所帮助!

问题内容

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

目前,我必须在每个 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()
}

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


解决方案


实现此目的的一种简单方法是将循环体提取到函数并重构代码,如下所示:

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

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

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

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>