Почему 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 в основном используется для реализации гигантских состояний машин внутри одной функции. Современная разработка программного обеспечения имеет тенденцию реализовывать государственные машины, разбивая их на классы и несколько методов, но некоторые люди не доверяют компилятору для оптимизации своего кода, поэтому они хотят вручную объединить все в одну гигантскую функцию.