go - 为什么 Go 有 "goto"语句?

标签 go goto

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

我一定错过了什么。为什么 Google 会包含它?

最佳答案

当我们实际查看 Go 标准库的源代码时,我们可以看到 gotos 实际应用得很好。

例如,在 math/gamma.go 文件中,the goto statement is used :

  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 使我们免于引入另一个仅用于控制流的( bool )变量,最后检查。 在这种情况下goto 语句实际上使代码更易于阅读和更容易理解(与您提到的反对 goto 的论点完全相反) .

还要注意,goto 语句有一个非常具体的用例。 language specification on goto声明它不能跳过进入作用域(被声明)的变量,也不能跳过其他(代码) block 。

关于go - 为什么 Go 有 "goto"语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11064981/

相关文章:

go - 无法分配给结构字段/分配给 nil 映射中的条目

string - 戈朗 : Strings Trim Function

http - 在 Google App Engine 上对封闭主体的读取无效

c - 在 C 中搜索道路时如何替换代码中的 goto

c# - 在C#中处理 “loop initialization”的其他方式

go - 在构建过程中运行命令行工具

python - 如何解析python提供的这些数据?

C goto循环不起作用

c# - 使用 goto 大小写(变量);在 C# 开关中

batch-file - 我的 goto 重定向不起作用,但可以使用 echo