Почему Go имеет инструкцию "goto"

Язык Google Go - это новый язык. Поэтому я с удивлением обнаружил, что у него есть 'goto'. Меня всегда учили, что заявления "goto" ушли в прошлое, и зло для него закрывает фактический поток программы. Функция (или методы, если хотите) всегда является лучшим способом управления потоком.

Мне что-то не хватает. Почему и когда используется "goto" хорошая идея? Или почему Google включил его?

Ответ 1

Когда мы на самом деле проверяем исходный код Gos (стандартную библиотеку), мы можем видеть, где 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 утверждает, что она не может перепрыгивать через переменные, входящие в область действия (объявляется), и может не перескакивать в другие (code-) блоки.

Ответ 2

Goto - хорошая идея, когда ни одна из встроенных функций управления не делает то, что вы хотите, и когда вы можете выразить то, что хотите, с goto. (Это позор в этих случаях на некоторых языках, когда у вас нет goto. В конечном итоге вы злоупотребляете некоторой функцией управления, используя логические флаги или используя другие решения, которые хуже, чем goto.)

Если какая-либо другая функция управления (используемая достаточно разумным образом) может делать то, что вы хотите, вы должны использовать ее в предпочтении goto. Если нет, смело и используйте goto!

Наконец, стоит отметить, что Go goto имеет некоторые ограничения, призванные избежать некоторых неясных ошибок. См. Эти ограничения в спецификации

Ответ 3

Готов к заявлениям было много дискредитировано со времен кода спагетти в 60-х и 70-х годах. В то время была очень плохая методология разработки программного обеспечения. Однако Goto не являются изначально злыми, но могут, конечно, злоупотреблять и злоупотреблять ленивыми или неквалифицированными программистами. Многие проблемы с злоупотреблением Gotos могут быть решены с помощью процессов разработки, таких как обзоры кода команды.

goto являются скачками в том же техническом порядке, что и continue, break и return. Можно утверждать, что эти утверждения являются злыми одинаково, но они не являются.

Почему команда Go включила Gotos, вероятно, из-за того, что это обычный примитив управления потоком. Кроме того, они, надеюсь, пришли к выводу, что в сферу действия Go исключается использование жестокого идиотского языка, который невозможно злоупотреблять.

Ответ 4

Насколько я могу судить, goto в основном используется для реализации гигантских состояний машин внутри одной функции. Современная разработка программного обеспечения имеет тенденцию реализовывать государственные машины, разбивая их на классы и несколько методов, но некоторые люди не доверяют компилятору для оптимизации своего кода, поэтому они хотят вручную объединить все в одну гигантскую функцию.