Me sorprendió descubrir que Go tiene una declaración "goto" . Siempre me han enseñado que las declaraciones 'goto' son cosa del pasado y malvado, ya que obstruyen el flujo real de un programa, y que las funciones o métodos son siempre una mejor manera de controlar el flujo.
Debo estar perdiendo algo. ¿Por qué Google lo incluyó?
goto
es útil en ciertos casos. Lea después de estudiar la respuesta de @ Kissaki.Respuestas:
Cuando realmente verificamos el código fuente de la biblioteca estándar de Go, podemos ver dónde
goto
están realmente bien aplicados los correos electrónicos.Por ejemplo, en el
math/gamma.go
archivo, se usa lagoto
declaración :En
goto
este caso, nos ahorra la introducción de otra variable (booleana) utilizada solo para el flujo de control, verificada al final. En este caso , lagoto
declaración hace que el código sea realmente mejor de leer y más fácil de seguir (muy al contrario del argumentogoto
que mencionaste en tu contra ).También tenga en cuenta que la
goto
declaración tiene un caso de uso muy específico. La especificación del lenguaje en goto establece que no puede saltar sobre las variables que entran en el alcance (siendo declaradas), y no puede saltar a otros bloques (de código).fuente
small(x,z)
para llamar? De esa forma, no tenemos que pensar en qué variables son accesibles en lasmall:
etiqueta. Sospecho que la razón es que go todavía carece de ciertos tipos de soporte en línea en el compilador.goto
apuntar a una etiqueta después de que se hayan introducido nuevas variables. La ejecución de la instrucción "goto" no debe provocar que entren en el alcance variables que no estuvieran ya en el alcance en el punto de goto.Ir a es una buena idea cuando ninguna de las funciones de control integradas hace exactamente lo que desea y cuando puede expresar lo que desea con un goto. (Es una pena en estos casos en algunos lenguajes cuando no tienes un goto. Terminas abusando de alguna función de control, usando indicadores booleanos o usando otras soluciones peores que goto).
Si alguna otra función de control (usada de una manera razonablemente obvia) puede hacer lo que desea, debe usarla en lugar de ir a goto. Si no, ¡sé atrevido y usa goto!
Finalmente, vale la pena señalar que Go's goto tiene algunas restricciones diseñadas para evitar algunos errores oscuros. Consulte estas restricciones en la especificación.
fuente
Las declaraciones de Goto han recibido mucho descrédito desde la era del código Spaghetti en los años 60 y 70. En aquel entonces, la metodología de desarrollo de software era muy pobre o nula. Sin embargo, los Goto no son malvados de forma nativa, sino que, por supuesto, pueden ser mal utilizados y abusados por programadores perezosos o inexpertos. Muchos problemas con Gotos abusados se pueden resolver con procesos de desarrollo, como revisiones de código de equipo.
goto
son saltos de la misma forma técnica quecontinue
,break
yreturn
. Se podría argumentar que estas son declaraciones son malas de la misma manera, pero no lo son.La razón por la que el equipo de Go ha incluido Gotos probablemente se deba al hecho de que es una primitiva común de control de flujo. Además, con suerte, concluyeron que el alcance de Go excluye hacer que un lenguaje seguro para idiotas no sea posible de abusar.
fuente
continue
,,break
yreturn
son muy diferentes en una clave en particular: solo especifican "dejar el ámbito adjunto". No solo fomentan, sino que exigen explícitamente que el desarrollador considere la estructura de su código y confíe en primitivas de programación estructuradas (para bucles, funciones y declaraciones de conmutación). La única gracia salvadora de lasgoto
declaraciones es que le permiten escribir ensamblado en una HLL cuando el optimizador del compilador no está a la altura de la tarea, pero esto tiene un costo de legibilidad y mantenibilidad.setjmp
,longjmp
,goto
, ytry / except / finally
eligieron a errar por el lado de precaución.goto
, fwict, es el único consentimiento al flujo de control previo a la "programación estructurada".