Control de bucles en Go
En Go, solo hay una sentencia de bucle: for. Go abandonó la sentencia while, la sentencia for se puede usar como while.
for
El formato de la sentencia es el siguiente
for init statement; expression; post statement {
execute statement
}Cuando solo se mantiene la condición del bucle, se convierte en while.
for expression {
execute statement
}Este es un bucle infinito, nunca terminará
for {
execute statement
}Ejemplo
Este es un código que imprime los números en el intervalo [0,20]
for i := 0; i <= 20; i++ {
fmt.Println(i)
}Puedes inicializar múltiples variables al mismo tiempo, y luego incrementarlas
for i, j := 1, 2; i < 100 && j < 1000; i, j = i+1, j+1 {
fmt.Println(i, j)
}Usarlo como while
num := 1
for num < 100 {
num *= 2
}Un bucle doble para imprimir la tabla de multiplicar del nueve, este es un caso de bucle muy clásico
func main() {
for i := 1; i <= 9; i++ {
for j := 1; j <= 9; j++ {
if i <= j {
fmt.Printf("%d*%d = %2d ", i, j, i*j)
}
}
fmt.Println()
}
}La salida es
1*1 = 1 1*2 = 2 1*3 = 3 1*4 = 4 1*5 = 5 1*6 = 6 1*7 = 7 1*8 = 8 1*9 = 9
2*2 = 4 2*3 = 6 2*4 = 8 2*5 = 10 2*6 = 12 2*7 = 14 2*8 = 16 2*9 = 18
3*3 = 9 3*4 = 12 3*5 = 15 3*6 = 18 3*7 = 21 3*8 = 24 3*9 = 27
4*4 = 16 4*5 = 20 4*6 = 24 4*7 = 28 4*8 = 32 4*9 = 36
5*5 = 25 5*6 = 30 5*7 = 35 5*8 = 40 5*9 = 45
6*6 = 36 6*7 = 42 6*8 = 48 6*9 = 54
7*7 = 49 7*8 = 56 7*9 = 63
8*8 = 64 8*9 = 72
9*9 = 81for range
for range puede recorrer de manera más conveniente algunas estructuras de datos iterables, como arrays, slices, cadenas, mapas y canales. El formato de la sentencia es el siguiente:
for index, value := range iterable {
// body
}index es el índice de la estructura de datos iterable, value es el valor correspondiente a ese índice. Por ejemplo, usar for range para recorrer una cadena.
func main() {
sequence := "hello world"
for index, value := range sequence {
fmt.Println(index, value)
}
}for range también puede iterar un valor entero, literales, constantes y variables son todos válidos.
for i := range 10 {
fmt.Println(i)
}
n := 10
for i := range n {
fmt.Println(i)
}
const n = 10
for i := range n {
fmt.Println(i)
}Para cada tipo de estructura de datos, la implementación de for range es diferente, se explicará más adelante. Puedes ir a Go - for statement para conocer más detalles.
break
La palabra clave break terminará el bucle for más interno, usada junto con etiquetas puede lograr el efecto de terminar el bucle externo. Ejemplo: este es un bucle doble
func main() {
for i := 0; i < 10; i++ {
for j := 0; j < 10; j++ {
if i <= j {
break
}
fmt.Println(i, j)
}
}
}Salida
1 0
2 0
2 1
3 0
3 1
3 2
...
9 6
9 7
9 8Usar etiquetas para interrumpir el bucle externo
func main() {
Outer:
for i := 0; i < 10; i++ {
for j := 0; j < 10; j++ {
if i <= j {
break Outer
}
fmt.Println(i, j)
}
}
}Salida
continue
La palabra clave continue saltará la iteración actual del bucle más interno y pasará directamente a la siguiente iteración. Usada junto con etiquetas puede lograr el efecto de saltar el bucle externo. Ejemplo:
func main() {
for i := 0; i < 10; i++ {
for j := 0; j < 10; j++ {
if i > j {
continue
}
fmt.Println(i, j)
}
}
}Salida
0 0
0 1
0 2
0 3
0 4
0 5
0 6
0 7
0 8
0 9
...
7 7
7 8
7 9
8 8
8 9
9 9Usar etiquetas
func main() {
Out:
for i := 0; i < 10; i++ {
for j := 0; j < 10; j++ {
if i > j {
continue Out
}
fmt.Println(i, j)
}
}
}Salida
0 0
0 1
0 2
0 3
0 4
0 5
0 6
0 7
0 8
0 9