为什么 Go 有一个“goto”语句?

新手上路,请多包涵

我惊讶地发现 Go 有一个 “goto” 语句。我一直被教导说“goto”语句已经成为过去,而且是邪恶的,因为它会阻塞程序的实际流程,而函数或方法始终是控制流程的更好方法。

我肯定错过了什么。为什么谷歌包括它?

原文由 harm 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 841
2 个回答

当我们真正查看Go标准库的源代码时,我们可以看到其中 goto s其实应用的很好。

例如,在 math/gamma.go 文件中, 使用了 goto 语句

   for x < 0 {
    if x > -1e-09 {
      goto small
    }
    z = z / x
    x = x + 1
  }
  for x < 2 {
    if x < 1e-09 {
      goto small
    }
    z = z / x
    x = x + 1
  }

  if x == 2 {
    return z
  }

  x = x - 2
  p = (((((x*_gamP[0]+_gamP[1])*x+_gamP[2])*x+_gamP[3])*x+_gamP[4])*x+_gamP[5])*x + _gamP[6]
  q = ((((((x*_gamQ[0]+_gamQ[1])*x+_gamQ[2])*x+_gamQ[3])*x+_gamQ[4])*x+_gamQ[5])*x+_gamQ[6])*x + _gamQ[7]
  return z * p / q

small:
  if x == 0 {
    return Inf(1)
  }
  return z / ((1 + Euler*x) * x)
}

goto 在这种情况下使我们免于引入另一个仅用于控制流的(布尔)变量,最后检查。 _在这种情况下_, goto 语句实际上使代码更易读且更容易遵循(与你提到的反对 goto 的论点完全相反)。

另请注意, goto 语句有一个非常具体的用例。 goto 上的语言规范 声明它可能不会跳过进入范围(被声明)的变量,并且它可能不会跳入其他(代码)块。

原文由 Kissaki 发布,翻译遵循 CC BY-SA 4.0 许可协议

当没有一个内置的控制功能完全符合您的要求,并且您可以使用 goto 表达您想要的内容时,Goto 是个好主意。 (在某些语言中,当您没有 goto 时,在这些情况下是一种耻辱。您最终会滥用某些控制功能,使用布尔标志,或使用比 goto 更糟糕的其他解决方案。)

如果某些其他控制功能(以相当明显的方式使用)可以完成您想要的操作,您应该优先使用它而不是 goto。如果没有,请大胆使用 goto!

最后值得注意的是 Go 的 goto 有一些限制,旨在避免一些不明显的错误。请参阅 规范中的 这些限制。

原文由 Sonia 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题