Bucles For en Golang

GolangBeginner
Practicar Ahora

Introducción

A diferencia de otros lenguajes, Go solo cuenta con la palabra clave "for" para las sentencias de bucle. Sin embargo, es sumamente eficiente y flexible. Vamos a conocer cómo funciona el bucle for en Go.

Puntos de conocimiento:

  • Bucle For
  • Bucle For range
Esta es una Práctica Guiada (Guided Lab), que proporciona instrucciones paso a paso para ayudarte a aprender y practicar. Sigue las instrucciones cuidadosamente para completar cada paso y obtener experiencia práctica. Los datos históricos muestran que esta es una práctica de nivel principiante con una tasa de finalización del 97%. Ha recibido una tasa de valoraciones positivas del 95% por parte de los alumnos.

Caracteres en una cadena

En la sección anterior sobre estructuras de datos básicas, aprendimos que una cadena (string) es una colección de caracteres. Por lo tanto, podemos usar el índice para obtener caracteres específicos de una cadena. Vamos a crear un archivo string.go y escribir el siguiente código:

cd ~/project
touch string.go
package main

import "fmt"

func main() {
    s := "labex"

    // Access each character in the string using indices
    fmt.Println(s[0], s[1], s[2], s[3], s[4])
    // Print characters
    fmt.Printf("%c %c %c %c %c\n", s[0], s[1], s[2], s[3], s[4])
}

Ejecuta el programa:

go run string.go

La salida es la siguiente:

108 97 98 101 120
l a b e x

En este programa, declaramos una variable de cadena para almacenar "labex" y usamos el índice para acceder a cada carácter. Al imprimir, observamos que el programa devuelve números en lugar de los caracteres literales.

Si comparamos estos valores con la siguiente tabla ASCII, veremos que los números corresponden a los caracteres reales. Por ejemplo, en la tabla ASCII, el "108" corresponde a la letra "l".

Esto sucede porque los caracteres almacenan en realidad la codificación numérica de cada símbolo bajo el estándar "UTF-8". Dado que "UTF-8" es compatible con "ASCII", la posición del carácter "l" guarda el valor numérico "108".

Si queremos mostrar los caracteres como tal, podemos usar la función fmt.Printf con la secuencia de escape %c. Esto se demuestra en la segunda línea del código, la cual convierte la codificación numérica en caracteres antes de imprimirlos.

Para acceder a cada carácter de la cadena en el archivo string.go, necesitamos declarar un índice manualmente cada vez. Esto resultaría muy tedioso si tuviéramos que manejar cientos o miles de datos. En estos casos, podemos emplear un bucle for para automatizar la operación.

Sintaxis del bucle For

Un bucle ejecuta un bloque de código basándose en una condición. Veamos la sintaxis de la sentencia for:

for initialization; condition; post {
    // code block
}

La sentencia de inicialización (initialization) inicializa una variable. La condición (condition) debe devolver un valor booleano. La sentencia posterior (post) modifica el valor de la variable en cada iteración del bucle. Veamos un ejemplo concreto.

Crea un archivo for.go en el directorio ~/project con el siguiente contenido:

cd ~/project
touch for.go
package main

import "fmt"

func main() {
    // Output numbers from 0 to 9
    for i := 0; i < 10; i++ {
        fmt.Println(i)
    }
}

Ejecuta el programa:

go run for.go

El resultado es el siguiente:

0
1
2
3
4
5
6
7
8
9

En este programa, primero inicializamos una variable temporal i en 0. En cada iteración, el valor de i aumenta en 1. La condición establece que el bucle continuará mientras i sea menor que 10, lo que significa que el programa imprimirá los números del 0 al 9.

Nota: En un bucle for, las sentencias de inicialización, condición y posterior son opcionales. Esto significa que incluso sin ellas, el bucle puede funcionar.

Si solo se incluye la sentencia de condición, el bucle for funciona de manera similar a un bucle "while" en otros lenguajes de programación.

El siguiente código utiliza únicamente la condición para lograr el mismo resultado que el programa anterior:

package main

import "fmt"

func main() {
    i := 0
    for i < 10 {
        fmt.Println(i)
        i++
    }
}

Como puedes observar, cuando solo está presente la condición, se pueden omitir los puntos y coma ; que normalmente separan las sentencias.

Uso del bucle For

Ahora que comprendemos la sintaxis, vamos a reescribir el primer programa string.go utilizando un bucle for.

package main

import "fmt"

func main() {
    s := "labex"
    for i := 0; i < len(s); i++ {
        fmt.Printf("%d %c\n", int(s[i]), s[i])
    }
}

Ejecuta el programa:

go run string.go

La salida será:

108 l
97 a
98 b
101 e
120 x

Ejercicio

Hagamos un pequeño ejercicio para consolidar lo aprendido sobre el bucle for.

Crea un archivo llamado for2.go. Tu tarea es imprimir cada carácter de la cadena "labex" en orden inverso.

Resultado esperado:

x
e
b
a
l

Requisitos:

  • El archivo for2.go debe estar ubicado en el directorio ~/project.
  • Debes usar un bucle for para obtener el resultado.

Pista: Recuerda que los índices comienzan en 0.

✨ Revisar Solución y Practicar

La palabra clave "break"

Anteriormente mencionamos que las tres sentencias de un bucle for son opcionales. ¿Qué pasaría si no declaramos ninguna? Vamos a probarlo.

Escribe el siguiente código en el archivo for.go:

package main

import "fmt"

func main() {
    for {
        fmt.Printf("1")
    }
}

Ejecuta el programa:

go run for.go

Verás que si no se declara una condición, el bucle asume que es true y continuará ejecutándose indefinidamente (bucle infinito).

Consejo: Presiona Ctrl+C para forzar la detención del programa.

Si queremos salir de un bucle bajo una condición específica sin haber declarado una condición inicial, o si no podemos escribirla directamente en la cabecera del for, usamos la palabra clave "break". Esta interrumpe inmediatamente la ejecución del bucle que la contiene.

Actualiza el archivo for.go con el siguiente código, que utiliza "break" para imprimir el número "1" exactamente 23 veces:

package main

import "fmt"

func main() {
    i := 0
    for {
        // Increment the value of i by 1 in each loop iteration
        i++
        fmt.Printf("1")
        // Exit the loop when the value of i is 23
        if i == 23 {
            break
        }
    }
}

La palabra clave "break" no solo se usa en bucles sin condiciones; también puede emplearse en bucles con condiciones normales. Cuando se cumple la condición del "break", el programa ignorará la condición principal del bucle y saldrá de él inmediatamente.

La palabra clave "continue"

Además de "break", que detiene el bucle por completo, existe la palabra clave "continue". Esta permite omitir el resto del código de la iteración actual y saltar directamente a la siguiente vuelta del bucle.

El uso de "continue" es similar al de "break", pero su función es distinta.

Actualicemos el archivo for.go para que imprima los números del 0 al 9, pero saltándose el 2 y el 8:

package main

import "fmt"

func main() {
    for i := 0; i < 10; i++ {
        if i == 2 || i == 8 {
            continue
        }
        fmt.Println(i)
    }
}

Ejecuta el programa:

go run for.go

La salida es la siguiente:

0
1
3
4
5
6
7
9

En este programa, añadimos una condición dentro del bloque del bucle. Si el valor actual de la variable es 2 u 8, se ejecuta continue, lo que hace que el programa ignore la instrucción fmt.Println(i) y comience la siguiente iteración. Por eso, los números 2 y 8 no aparecen en la consola.

Resumen

En esta práctica, hemos explorado el funcionamiento del bucle for. Repasemos los puntos clave:

  • Los tres parámetros del bucle for son opcionales.
  • La palabra clave break se utiliza para salir del bucle actual de forma inmediata.
  • La palabra clave continue sirve para saltar la iteración actual y pasar directamente a la siguiente.