1. ホーム
  2. go

[解決済み] なぜGoには "goto "文があるのですか?[クローズド]

2022-05-31 01:41:16

質問

驚いたことに、Goには 'ゴト' ステートメントがあることに驚きました。私はいつも、'goto' ステートメントはプログラムの実際の流れを妨げるので過去のものであり悪であり、関数やメソッドは常に流れを制御するためのより良い方法であると教えられてきました。

私は何かを見逃しているに違いない。なぜ Google はそれを含めたのでしょうか?

どのように解決するのですか?

実際にGo標準ライブラリのソースコードを確認すると、どこに goto が実際にうまく適用されていることがわかります。

例えば 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 は、スコープに入る (宣言される) 変数を飛び越えてはならず、他の (コード) ブロックに飛び越えてはならないことを述べています。