07 Loops
Published Apr 24, 2023
1. Sintaxis del For B谩sico
La estructura b谩sica de un bucle for
incluye tres partes: init, condition y post statement.
for init; condition; post {
// C贸digo que se ejecutar谩 mientras la condici贸n sea verdadera
}
Un loop (o bucle) es una estructura que permite ejecutar un bloque de c贸digo repetidamente mientras se cumpla una condici贸n. En Go, la 煤nica estructura de bucle disponible es el for
, que puede adoptar diferentes formas para cubrir una variedad de casos de uso.
Componentes:
- Init: Se ejecuta una vez al inicio del bucle (por ejemplo, inicializaci贸n de variables).
- Condition: Eval煤a si el bucle debe continuar. Si es
false
, el bucle se detiene. - Post statement: Se ejecuta despu茅s de cada iteraci贸n (por ejemplo, incremento de variables).
Ejemplo:
for i := 0; i < 5; i++ {
fmt.Println(i)
}
2. For con M煤ltiples Variables
Puedes declarar y modificar varias variables en el for
, tanto en el init como en el post statement.
Ejemplo:
for i, j := 0, 10; i < 5; i, j = i+1, j-1 {
fmt.Println(i, j)
}
3. For sin Init Condition ni Post Statement
Las secciones init y post son opcionales. Esto hace que el for
de Go sea muy flexible.
Ejemplo:
limit := 10
b := 0
for b <= limit {
fmt.Println(b)
b++
}
4. Bucle Infinito
Si omites la condici贸n, obtendr谩s un bucle infinito. 脷til cuando quieres un bucle que dependa de instrucciones internas como break
o return
.
Ejemplo:
i := 0
for {
fmt.Println("Hola")
if i > 5 {
break
}
i++
}
5. Iterar sobre Colecciones con For-Range
El bucle for-range
es una herramienta poderosa para recorrer slices, arrays, strings, maps, o canales.
Sintaxis:
for 铆ndice, valor := range colecci贸n {
// C贸digo que utiliza 铆ndice y valor
}
Ejemplo con Slices:
OS := []string{"iOS", "Android", "Windows"}
for i, v := range OS {
fmt.Println(i, v)
}
Ejemplo con Strings:
for pos, char := range "Hello, world!" {
fmt.Printf("Posici贸n: %d, Car谩cter: %q\n", pos, char)
}
6. Break y Continue
break
: Sale del bucle actual.continue
: Salta a la siguiente iteraci贸n del bucle.
Ejemplo:
for i := 0; i < 10; i++ {
if i == 5 {
break // Sale del bucle cuando i es 5
}
if i%2 == 0 {
continue // Salta n煤meros pares
}
fmt.Println(i)
}
7. Labels con Break y Continue
Go permite usar labels para identificar bucles espec铆ficos, lo que es 煤til cuando trabajas con bucles anidados.
Break con Label:
Outerloop:
for i := 1; i <= 5; i++ {
for j := 1; j <= 5; j++ {
if i == 3 {
break Outerloop // Sale del bucle Outerloop
}
fmt.Printf("%d * %d = %d\n", i, j, i*j)
}
}
Continue con Label:
Outerloop:
for i := 1; i <= 5; i++ {
for j := 1; j <= 5; j++ {
if i == 3 {
continue Outerloop // Salta el resto de las iteraciones del bucle externo
}
fmt.Printf("%d * %d = %d\n", i, j, i*j)
}
}
8. Iterar Strings con For-Range
El for-range
sobre strings devuelve 铆ndices y runas (n煤meros Unicode).
Ejemplo:
for pos, char := range "GoLang" {
fmt.Printf("Posici贸n: %d, Car谩cter: %c\n", pos, char)
}
Si necesitas los caracteres como strings, puedes convertirlos:
for _, char := range "GoLang" {
fmt.Println(string(char)) // Convierte runas a string
}
9. For como While
Aunque Go no tiene un bucle while
, puedes emularlo f谩cilmente con un for
sin init ni post.
Ejemplo:
counter := 0
for counter < 5 {
fmt.Println(counter)
counter++
}
10. Resumen
- Estructura b谩sica:
for init; condition; post { ... }
. - Flexible: Puede omitir
init
,condition
, opost
. - For-range: Ideal para recorrer colecciones y strings.
- Break y Continue: Controlan la ejecuci贸n dentro de bucles.
- Labels: Facilitan el control de bucles anidados.
- Go no tiene
while
, pero puedes lograr lo mismo con unfor
.
Con estos conceptos, puedes dominar el control de bucles en Go de manera eficiente y escribir c贸digo m谩s limpio y legible.