A Instrução `goto`
Parte da seção Lógica & Fluxo do Journey de GO da Coddy — lição 4 de 68.
A instrução goto em Go permite transferir o controle diretamente para uma instrução rotulada dentro da mesma função. Embora o Go inclua esse recurso, ele é raramente usado na programação Go moderna porque estruturas de controle mais claras, como loops e instruções if, são preferidas.
Para usar goto, você primeiro define um rótulo escrevendo um identificador seguido por dois pontos. Então você pode pular para esse rótulo usando goto seguido pelo nome do rótulo.
func main() {
i := 0
start:
fmt.Println("Count:", i)
i++
if i < 3 {
goto start
}
fmt.Println("Done!")
}Neste exemplo, o programa salta de volta para o rótulo start até que a condição não seja mais atendida. No entanto, essa mesma lógica seria muito mais clara usando um laço for. A instrução goto pode tornar o código mais difícil de ler e manter, e é por isso que geralmente é desencorajada em favor do fluxo de controle estruturado.
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Desafio
FácilNeste desafio, você praticará o uso da instrução goto para criar um mecanismo simples de repetição (retry). Você está construindo um sistema de conexão que tenta estabelecer uma conexão e repete um número específico de vezes caso falhe.
Você receberá duas entradas:
- Uma string representando o número máximo de tentativas de repetição (ex:
"3") - Uma string representando o número da tentativa que terá sucesso (ex:
"2")
Sua tarefa é:
- Analisar (parse) o número máximo de tentativas da primeira entrada
- Analisar (parse) o número da tentativa de sucesso da segunda entrada
- Usar uma instrução
gotocom um rótulo (label) para implementar a lógica de repetição - Começar com a tentativa número 1 e incrementar após cada tentativa falha
- Para cada tentativa que falhar, imprimir
"Attempt [attempt_number] failed" - Quando o número da tentativa corresponder ao número da tentativa de sucesso, imprimir
"Attempt [attempt_number] succeeded"e sair - Se você exceder o número máximo de tentativas sem sucesso, imprimir
"All attempts failed"e sair
Use a instrução goto para saltar de volta para o rótulo de repetição quando uma tentativa falhar e você não tiver excedido o número máximo de tentativas. Os números das tentativas devem começar em 1.
Folha de consulta
A instrução goto transfere o controle diretamente para uma instrução rotulada dentro da mesma função. Defina um rótulo com um identificador seguido por dois pontos e, em seguida, salte para ele usando goto:
func main() {
i := 0
start:
fmt.Println("Count:", i)
i++
if i < 3 {
goto start
}
fmt.Println("Done!")
}Embora o goto esteja disponível em Go, ele é raramente usado na programação Go moderna, pois o fluxo de controle estruturado, como loops e instruções if, é mais claro e fácil de manter.
Experimente você mesmo
package main
import (
"fmt"
"strconv"
)
func main() {
// Ler entrada
var maxRetriesStr string
var successAttemptStr string
fmt.Scanln(&maxRetriesStr)
fmt.Scanln(&successAttemptStr)
// Converter entradas para inteiros
maxRetries, _ := strconv.Atoi(maxRetriesStr)
successAttempt, _ := strconv.Atoi(successAttemptStr)
// Inicializar contador de tentativas
attempt := 1
// TODO: Escreva seu código abaixo
// Use a instrução goto com um rótulo para implementar a lógica de nova tentativa
}Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Lógica & Fluxo
1Fluxo de Controle Avançado
Switch com `fallthrough`Interrompendo Loops AninhadosContinuando um Loop EspecíficoA Instrução `goto`Recapitulação - Controle de Loop Avançado4Projeto: Lista de Tarefas Simples
Configuração do ProjetoAdicionando uma Tarefa2Structs e Métodos
Definindo Métodos em StructsRecebedores de ValorRecebedores de PonteiroEscolhendo RecebedoresMétodos vs FunçõesRecapitulação - Comportamento de Structs5Mapas em Profundidade
Mapas de StructsPonteiros como Valores de MapVerificando Mapas NilComparando MapasRecapitulação - Contador de Frequência de Palavras3Interfaces (O Básico)
O que é uma Interface?Definindo uma InterfaceImplementando uma InterfaceUsando Tipos de InterfaceInterface VaziaAsserções de TipoType SwitchRecapitulação - Formas e Comportamentos