Recorrer en bucle los datos con expresiones for

Completado

Otro flujo de control común es un bucle. Go usa solo una construcción de bucle, que es el bucle for. Sin embargo, puede representar bucles de varias maneras. En este artículo, aprenderá sobre los patrones de bucle que admite Go.

Sintaxis básica del bucle for

Al igual que las instrucciones if y switch, las expresiones de bucle for no necesitan paréntesis. Sin embargo, las llaves sí son necesarias.

Los tres componentes de los bucles for están separados por punto y coma (;):

  • Una instrucción inicial que se ejecuta antes de la primera iteración (opcional).
  • Una expresión de condición que se evalúa antes de cada iteración. El bucle se detiene cuando esta condición es false.
  • Una instrucción posterior que se ejecuta al final de cada iteración (opcional).

Como puede ver, el bucle for en Go es similar al bucle for en lenguajes de programación como C, Java y C#.

En su forma más simple, un bucle for en Go tiene el siguiente aspecto:

func main() {
    sum := 0
    for i := 1; i <= 100; i++ {
        sum += i
    }
    fmt.Println("sum of 1..100 is", sum)
}

Veamos de qué otro modo se pueden escribir bucles en Go.

Instrucciones previas y posteriores vacías

En algunos lenguajes de programación, se usa la palabra clave while para escribir patrones de bucle en los que solo se requiere la expresión de condición. Go no tiene ninguna palabra clave while. Pero puede usar un bucle for en su lugar y aprovechar que Go hace que las instrucciones previas y posteriores sean opcionales.

Use el siguiente fragmento de código para confirmar que puede usar el bucle for sin utilizar instrucciones previas y posteriores.

package main

import (
    "fmt"
    "math/rand"
    "time"
)

func main() {
    var num int64
    rand.Seed(time.Now().Unix())
    for num != 5 {
        num = rand.Int63n(15)
        fmt.Println(num)
    }
}

Siempre y cuando la variable num contenga un valor distinto de 5, el programa imprime un número aleatorio.

Bucles infinitos e instrucciones de interrupción

Otro patrón de bucle que se puede escribir en Go es el bucle infinito. En este caso, no se escribe una expresión de condición o una instrucción previa o posterior. En su lugar, se escribe la salida del bucle. De lo contrario, la lógica nunca se cerrará. Para que la lógica salga de un bucle, use la palabra clave break.

Para escribir un bucle infinito adecuado, escriba llaves después de la palabra clave for, como aquí:

package main

import (
    "fmt"
    "math/rand"
    "time"
)

func main() {
    var num int32
    sec := time.Now().Unix()
    rand.Seed(sec)

    for {
        fmt.Print("Writing inside the loop...")
        if num = rand.Int31n(10); num == 5 {
            fmt.Println("finish!")
            break
        }
        fmt.Println(num)
    }
}

Cada vez que se ejecute este código, obtendrá una salida diferente.

Instrucciones de continuación

En Go, puede usar la palabra clave continue para omitir la iteración actual de un bucle. Puede usar esta palabra clave, por ejemplo, para ejecutar una validación antes de que el bucle continúe. También se puede usar cuando se escribe un bucle infinito y es necesario esperar a que un recurso esté disponible.

En este ejemplo se usa la palabra clave continue:

package main

import "fmt"

func main() {
    sum := 0
    for num := 1; num <= 100; num++ {
        if num%5 == 0 {
            continue
        }
        sum += num
    }
    fmt.Println("The sum of 1 to 100, but excluding numbers divisible by 5, is", sum)
}

Este ejemplo tiene un bucle for que recorre en iteración del 1 al 100, y el número actual se agrega a la suma de cada iteración. Todos los números divisibles por 5 se omiten en la iteración actual del bucle y no se agregan a la suma.