Skip to content

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

go
for init statement; expression; post statement {
  execute statement
}

Cuando solo se mantiene la condición del bucle, se convierte en while.

go
for expression {
  execute statement
}

Este es un bucle infinito, nunca terminará

go
for {
  execute statement
}

Ejemplo

Este es un código que imprime los números en el intervalo [0,20]

go
for i := 0; i <= 20; i++ {
    fmt.Println(i)
}

Puedes inicializar múltiples variables al mismo tiempo, y luego incrementarlas

go
for i, j := 1, 2; i < 100 && j < 1000; i, j = i+1, j+1 {
  fmt.Println(i, j)
}

Usarlo como while

go
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

go
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

go
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 = 81

for 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:

go
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.

go
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.

go
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

go
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 8

Usar etiquetas para interrumpir el bucle externo

go
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:

go
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 9

Usar etiquetas

go
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

Golang editado por www.golangdev.cn