La sentencia `goto`
Parte de la sección Lógica y Flujo del Journey de GO de Coddy — lección 4 de 68.
La sentencia goto en Go permite transferir el control directamente a una sentencia etiquetada dentro de la misma función. Aunque Go incluye esta característica, rara vez se utiliza en la programación moderna de Go porque se prefieren estructuras de control más claras como los bucles y las sentencias if.
Para usar goto, primero defines una etiqueta escribiendo un identificador seguido de dos puntos. Luego puedes saltar a esa etiqueta usando goto seguido del nombre de la etiqueta.
func main() {
i := 0
start:
fmt.Println("Count:", i)
i++
if i < 3 {
goto start
}
fmt.Println("Done!")
}En este ejemplo, el programa salta de nuevo a la etiqueta start hasta que la condición ya no se cumpla. Sin embargo, esta misma lógica sería mucho más clara utilizando un bucle for. La sentencia goto puede hacer que el código sea más difícil de leer y mantener, razón por la cual generalmente se desaconseja en favor del flujo de control estructurado.
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Desafío
FácilEn este desafío, practicarás el uso de la sentencia goto para crear un mecanismo de reintento simple. Estás construyendo un sistema de conexión que intenta establecer una conexión y reintenta un número específico de veces si falla.
Recibirás dos entradas:
- Una cadena que representa el número máximo de intentos de reintento (por ejemplo,
"3") - Una cadena que representa el número de intento que tendrá éxito (por ejemplo,
"2")
Tu tarea es:
- Analizar el número máximo de intentos de reintento de la primera entrada
- Analizar el número de intento de éxito de la segunda entrada
- Usar una sentencia
gotocon una etiqueta para implementar la lógica de reintento - Comenzar con el número de intento 1 e incrementar después de cada intento fallido
- Para cada intento que falle, imprimir
"Attempt [attempt_number] failed" - Cuando el número de intento coincida con el número de intento de éxito, imprimir
"Attempt [attempt_number] succeeded"y salir - Si excedes el número máximo de intentos de reintento sin éxito, imprimir
"All attempts failed"y salir
Usa la sentencia goto para saltar de regreso a la etiqueta de reintento cuando un intento falle y no hayas excedido el número máximo de intentos. Los números de intento deben comenzar desde 1.
Hoja de referencia
La sentencia goto transfiere el control directamente a una sentencia etiquetada dentro de la misma función. Define una etiqueta con un identificador seguido de dos puntos, luego salta a ella usando goto:
func main() {
i := 0
start:
fmt.Println("Count:", i)
i++
if i < 3 {
goto start
}
fmt.Println("Done!")
}Aunque goto está disponible en Go, rara vez se utiliza en la programación moderna de Go, ya que el flujo de control estructurado, como los bucles y las sentencias if, son más claros y fáciles de mantener.
Pruébalo tú mismo
package main
import (
"fmt"
"strconv"
)
func main() {
// Leer entrada
var maxRetriesStr string
var successAttemptStr string
fmt.Scanln(&maxRetriesStr)
fmt.Scanln(&successAttemptStr)
// Convertir entradas a enteros
maxRetries, _ := strconv.Atoi(maxRetriesStr)
successAttempt, _ := strconv.Atoi(successAttemptStr)
// Inicializar contador de intentos
attempt := 1
// TODO: Escribe tu código a continuación
// Usa la sentencia goto con una etiqueta para implementar la lógica de reintento
}Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Lógica y Flujo
1Flujo de control avanzado
Switch con `fallthrough`Salir de bucles anidadosContinuar un bucle específicoLa sentencia `goto`Repaso: Control de bucles avanzado4Proyecto: Lista de tareas sencilla
Configuración del proyectoAñadir una tarea2Estructuras y Métodos
Definición de métodos en estructurasReceptores de valorReceptores de punteroElegir receptoresMétodos vs FuncionesResumen - Comportamiento de estructuras5Mapas en profundidad
Mapas de StructsPunteros como valores de MapVerificación de Maps NilComparación de MapsResumen - Contador de frecuencia de palabras3Interfaces (Conceptos básicos)
¿Qué es una interfaz?Definir una interfazImplementar una interfazUso de tipos de interfazInterfaz vacíaAserciones de tipoType SwitchResumen: Formas y comportamientos