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.
Desafio
FácilNeste desafio, você praticará o uso da instrução goto para criar um mecanismo simples de nova tentativa. Você está criando um sistema de conexão que tenta estabelecer uma conexão e faz novas tentativas um número específico de vezes caso falhe.
Você receberá duas entradas:
- Uma string que representa o número máximo de tentativas (por exemplo,
"3") - Uma string que representa o número da tentativa que terá sucesso (por exemplo,
"2")
Sua tarefa é:
- Interpretar o número máximo de tentativas a partir da primeira entrada
- Interpretar o número da tentativa bem-sucedida a partir da segunda entrada
- Usar uma instrução
gotocom um rótulo para implementar a lógica de novas tentativas - Começar com o número da tentativa igual a 1 e incrementá-lo após cada tentativa malsucedida
- Para cada tentativa que falhar, imprimir
"Attempt [attempt_number] failed" - Quando o número da tentativa corresponder ao número da tentativa bem-sucedida, imprimir
"Attempt [attempt_number] succeeded"e sair - Se você exceder o número máximo de tentativas sem obter sucesso, imprimir
"All attempts failed"e sair
Use a instrução goto para voltar ao rótulo de nova tentativa 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.
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 ComportamentosPratique por conta própria: Compilador de Go online