Я был удивлен, обнаружив, что в Go есть инструкция goto . Меня всегда учили, что операторы goto ушли в прошлое и являются злом, поскольку они перекрывают реальный поток программы, и что функции или методы всегда являются лучшим способом управления потоком.
Я, должно быть, что-то упускаю. Почему Google включил это?
goto
это полезно в определенных случаях. Прочтите после изучения ответа @Kissaki.Ответы:
Когда мы действительно проверим исходный код стандартной библиотеки Go, мы увидим, где на
goto
самом деле хорошо применены s.Например, в
math/gamma.go
файле используетсяgoto
инструкция :В
goto
этом случае мы избавляемся от введения другой (логической) переменной, используемой только для потока управления, проверяемой в конце. В этом случае , тоgoto
оператор делает код на самом деле лучше читать и легче последующей (вполне в отличие от аргумента противgoto
вы упомянули).Также обратите внимание, что этот
goto
оператор имеет очень специфический вариант использования. В спецификации языка goto указано, что он не может перепрыгивать через переменные, входящие в область видимости (объявляемые), и не может переходить в другие (кодовые) блоки.источник
small(x,z)
вместо этого просто не ввести функцию для вызова? Таким образом, нам не нужно думать о том, какие переменные доступны вsmall:
метке. Я подозреваю, что причина в том, что в go все еще отсутствует поддержка определенных типов встраивания в компиляторе.goto
указывать на метку после того, как были введены новые переменные. Выполнение оператора "goto" не должно вызывать попадание в область видимости каких-либо переменных, которые еще не были в области видимости на момент перехода.Goto - хорошая идея, когда ни одна из встроенных функций управления не делает то, что вы хотите, и когда вы можете выразить то, что хотите, с помощью goto. (Жалко в этих случаях на некоторых языках, когда у вас нет goto. В конечном итоге вы злоупотребляете некоторыми функциями управления, используете логические флаги или другие решения хуже, чем goto.)
Если какая-то другая функция управления (используемая достаточно очевидным образом) может делать то, что вы хотите, вам следует использовать ее вместо goto. Если нет, проявите смелость и используйте goto!
Наконец, стоит отметить, что goto Go имеет некоторые ограничения, призванные избежать некоторых неясных ошибок. См. Эти ограничения в спецификации.
источник
Утверждения Goto получили много дискредитации со времен эры кода спагетти в 60-х и 70-х годах. В то время методология разработки программного обеспечения была очень плохой. Однако Goto изначально не является злом, но, конечно, может быть неправильно использован ленивыми или неквалифицированными программистами. Многие проблемы со злоупотреблениями Gotos можно решить с помощью процессов разработки, таких как проверка кода команды.
goto
являются прыжками в той же технической манереcontinue
, чтоbreak
и , иreturn
. Кто-то может возразить, что эти утверждения являются злом, но это не так.Команда Go включила Gotos, вероятно, из-за того, что это обычный примитив управления потоком. Вдобавок они, надеюсь, пришли к выводу, что Go исключает возможность злоупотребления безопасным для идиотов языком.
источник
continue
,,break
иreturn
сильно различаются в одном ключе: они определяют только «выход за пределы области видимости». Они не только поощряют, но и явно требуют, чтобы разработчик рассматривал структуру своего кода и полагался на примитивы структурированного программирования (для циклов, функций и операторов переключения). Единственное, что позволяет сэкономить наgoto
операторах - это то, что они позволяют писать сборку в HLL, когда оптимизатор компилятора не справляется с этой задачей, но это происходит за счет удобства чтения и поддержки.setjmp
,longjmp
,goto
иtry / except / finally
они решило подстраховаться на стороне осторожности.goto
, fwict, единственное согласие с потоком управления предварительно "структурированного программирования".