O comando goto (do inglês go to, em português ir para) é uma estrutura de controle para salto de instruções.
Sua sintaxe é, em geral: goto destino , onde destino pode ser um label (rótulo ou nome de um endereço) ou um número, que representa um determinado endereço. As instruções passam a ser executadas no endereço apontado por destino.
Em assembly de x86, o controle de fluxo é baseado em saltos (instruções como JMP, JZ, JNZ), que são comparáveis ao goto das linguagens de programação de alto nível.Ver págs. 18, 38 e seguintes de DELGADO, José. Introdução à programação em linguagem assembly. 2013. Acesso em 6Jul2018. PRADO, Sergio. Você usa goto nos seus códigos em C?. 2011. Acesso em 6Jul2018.
Situações de uso
Críticas de Dijkstra à legibilidade de programas escritos com uso extensivo de goto DIJKSTRA, Edsger W. A Case against the GO TO Statement. 1968. geraram, entre diversas reações, a humorística instrução ComeFrom (vir de). William Slater & Howard Modell. Structured Programming Considered Harmful. R. Lawrence Clark. We don't know where to GOTO if we don't know where we've COME FROM. This linguistic innovation lives up to all expectations. From DATAMATION, December, 1973. CPAN. Acme::ComeFrom - Parallel Goto-in-reverse. ComeFrom em Perl. Entrian. goto for Python ("Adds the 'goto' and 'comefrom' keywords to Python.").
Donald Knuth analisou e avaliou quão apropriado é (ou não) o uso de goto em diversas situações. KNUTH, Donald. Structured Programming with go to Statements. Há também um estudo sobre o uso dessa instrução em projetos de software escritos em C. An Empirical Study of goto in C Code. 2015.
Uma retrospectiva sobre o assunto é apresentada por David Tribble, com diversos exemplos de código (C, C++, Assembly, Java) com e sem uso de goto. TRIBBLE, David R. Go To Statement Considered Harmful: A Retrospective. Rev. 1.1, 2005-11-27. Acesso em 9Jul2018.
Exemplos
BASIC (não confundir com Visual Basic ou outros Basic)
Uso de goto para criar uma estrutura de repetição (também chamada laço, ciclo ou loop):
10 PRINT "Quanto é 7 - 7?" 20 INPUT A 30 IF A = 0 THEN GOTO 60 40 PRINT "Errado... Tente outra vez!" 50 GOTO 20 60 PRINT "Certo! Parabéns!" 70 END
C
Uma aplicação citada por Brian Kernighan & Dennis RitchieKERNIGHAN & RITCHIE. The C Programming Language. 2ed. p.57−58. é para escapar de laços muito aninhados:
for (i=0; i<P; i++) { for (j=0; j<Q; j++) { for (k=0; k<R; k++) { ... if ( condicao ) goto CONTINUACAO; ...
CONTINUACAO: ...
Em linguagens sem suporte a tratamento de exceções (como é o caso de C), goto pode ser usado para desfazer ações em ordem reversa, em caso de erro: Linux: Using goto In Kernel Code
int realizaProcedimentos(void) { int estado;
estado = fazPrimeiraEtapa(); if (estado==ERRO) goto RESTAURA1;
estado = fazSegundaEtapa(); if (estado==ERRO) goto RESTAURA2;
estado = fazTerceiraEtapa(); if (estado==ERRO) goto RESTAURA3;
return (SUCESSO);
RESTAURA3: desfazTerceiraEtapa(); RESTAURA2: desfazSegundaEtapa(); RESTAURA1: desfazPrimeiraEtapa();
return (ERRO); }
Categoria:Estruturas de controle