Fiquei surpreso ao descobrir que Go tem uma declaração 'goto' . Sempre fui ensinado que as declarações 'goto' são coisas do passado e más, pois obstruem o fluxo real de um programa, e que funções ou métodos são sempre uma maneira melhor de controlar o fluxo.
Eu devo estar esquecendo alguma coisa. Por que o Google o incluiu?
goto
é útil em certos casos. Leia depois de estudar a resposta de @ Kissaki.Respostas:
Quando realmente verificamos o código-fonte da biblioteca padrão Go, podemos ver onde os
goto
s estão realmente bem aplicados.Por exemplo, no
math/gamma.go
arquivo, agoto
instrução é usada :O
goto
neste caso nos poupa de introduzir outra variável (booleana) usada apenas para controle de fluxo, verificada no final. Nesse caso , agoto
instrução torna o código realmente melhor de ler e mais fácil de seguir (ao contrário do argumento contra quegoto
você mencionou).Observe também que a
goto
instrução tem um caso de uso muito específico. A especificação da linguagem em goto afirma que ela não pode saltar sobre as variáveis que entram no escopo (sendo declaradas) e não pode saltar para outros blocos (código-).fonte
small(x,z)
a ser chamada? Dessa forma, não precisamos pensar sobre quais variáveis estão acessíveis nosmall:
rótulo. Suspeito que o motivo seja go ainda carece de certos tipos de suporte embutido no compilador.goto
apontar para um rótulo após a introdução de novas variáveis. Executar a instrução "goto" não deve fazer com que nenhuma variável entre no escopo que ainda não estivesse no escopo no ponto do goto.Goto é uma boa ideia quando nenhum dos recursos de controle integrados faz exatamente o que você deseja e quando você pode expressar o que deseja com um goto. (É uma pena, nesses casos, em alguns idiomas, quando você não tem um goto. Você acaba abusando de algum recurso de controle, usando sinalizadores booleanos ou usando outras soluções piores do que goto.)
Se algum outro recurso de controle (usado de maneira razoavelmente óbvia) pode fazer o que você deseja, você deve usá-lo em preferência para ir para. Se não, seja ousado e use goto!
Finalmente, é importante notar que goto de Go tem algumas restrições destinadas a evitar alguns bugs obscuros. Veja essas restrições nas especificações.
fonte
As declarações de Goto receberam muito descrédito desde a era do código Spaghetti nos anos 60 e 70. Naquela época, a metodologia de desenvolvimento de software era muito pobre ou inexistente. No entanto, Goto não é nativamente mau, mas pode, claro, ser mal usado e abusado por programadores preguiçosos ou não qualificados. Muitos problemas com Gotos abusados podem ser resolvidos com processos de desenvolvimento, como revisões de código de equipe.
goto
são saltos da mesma maneira técnica quecontinue
,break
ereturn
. Alguém poderia argumentar que essas afirmações são más da mesma maneira, mas não são.A razão pela qual a equipe Go incluiu o Gotos é provavelmente devido ao fato de que é um primitivo de controle de fluxo comum. Além disso, eles esperançosamente concluíram que o escopo do Go exclui tornar uma linguagem segura para idiotas impossível de ser abusada.
fonte
continue
,,break
ereturn
são muito diferentes em uma chave particular: eles especificam apenas "deixar o escopo delimitador". Eles não apenas encorajam, mas explicitamente exigem que o desenvolvedor considere a estrutura de seu código e confie em primitivas de programação estruturadas (para loops, funções e instruções switch). A única graça dasgoto
instruções é que elas permitem que você grave assembly em um HLL quando o otimizador do compilador não está à altura da tarefa, mas isso tem um custo de legibilidade e manutenção.setjmp
,longjmp
,goto
, etry / except / finally
eles escolheram para err no lado de cautela.goto
, fwict, é a única aquiescência ao fluxo de controle de pré-"programação estruturada".