¿Existe foreach en Go? Guía paso a paso para principiantes

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

¿Existe foreach en Go? Tutorial paso a paso con ejemplos

\n\n

Si vienes a Go desde Python, JavaScript o PHP, seguramente estás acostumbrado al conciso foreach para recorrer colecciones. Y entonces escribes tu primer bucle en Go y te preguntas: «¿Y dónde está mi querido foreach? ¿Acaso Go no lo tiene?»

\n\n

Spoiler: la palabra clave directa foreach realmente no existe en Go. Pero hay algo mucho más flexible y potente: la construcción for range. En este tutorial analizaremos cómo funciona la iteración en Go, mostraremos ejemplos reales de código y lo compararemos con el conocido foreach de otros lenguajes.

\n\n

¿Por qué Go no tiene foreach y para qué sirve range?

\n\n

Go es un lenguaje minimalista. Sus creadores evitaron intencionadamente la duplicación de construcciones sintácticas. En lugar de agregar una palabra clave separada foreach, ampliaron las capacidades del bucle for existente. Así nació for range, una herramienta universal para recorrer arrays, slices, maps, strings e incluso channels.

\n\n

Si buscas un análogo exacto de foreach en Go, aquí lo tienes: for range.

\n\n

Sintaxis de for range: explicación sencilla

\n\n

La estructura básica es la siguiente:

\n\n
for index, value := range collection {\n    // cuerpo del bucle\n}
\n\n

Donde:

\n
    \n
  • index — el índice del elemento (para arrays y slices) o la clave (para maps).
  • \n
  • value — una copia del valor del elemento.
  • \n
  • collection — tu colección (slice, array, map, string o channel).
  • \n
\n\n

Un punto importante: value es siempre una copia del elemento. Si modificas value dentro del bucle, el elemento original no cambiará. Para modificar los originales, debes acceder a través del índice.

\n\n

Ejemplo 1: Recorrer un slice — análogo de foreach en Go

\n\n

Empecemos con el caso más común: recorrer los elementos de un slice:

\n\n
package main\n\nimport "fmt"\n\nfunc main() {\n    fruits := []string{"manzana", "plátano", "cereza", "melón"}\n\n    fmt.Println("Recorrido del slice (análogo a foreach):")\n    for index, fruit := range fruits {\n        fmt.Printf("Índice %d: %s\\n", index, fruit)\n    }\n}
\n\n

Salida:

\n
Recorrido del slice (análogo a foreach):\nÍndice 0: manzana\nÍndice 1: plátano\nÍndice 2: cereza\nÍndice 3: melón
\n\n

Si solo necesitas el índice (por ejemplo, para modificar elementos), puedes omitir el valor:

\n\n
for i := range fruits {\n    fruits[i] = "fruta: " + fruits[i]\n}
\n\n

Y si solo necesitas los valores, usa el guion bajo _:

\n\n
for _, fruit := range fruits {\n    fmt.Println(fruit)\n}
\n\n

Ejemplo 2: Recorrer un map — foreach clásico

\n\n

En Go no hay una forma más elegante de recorrer maps que con for range:

\n\n
package main\n\nimport "fmt"\n\nfunc main() {\n    ages := map[string]int{\n        "Ana": 25,\n        "Borja": 30,\n        "Víctor": 35,\n    }\n\n    fmt.Println("Recorrido del map (foreach):")\n    for name, age := range ages {\n        fmt.Printf("%s: %d años\\n", name, age)\n    }\n}
\n\n

El orden de recorrido de un map en Go no está garantizado. Si necesitas un orden estable, recoge las claves en un slice y ordénalo.

\n\n

Ejemplo 3: Recorrer un string — iteración carácter por carácter

\n\n

A diferencia de muchos lenguajes, for range en Go itera sobre runas (caracteres Unicode), no sobre bytes:

\n\n
package main\n\nimport "fmt"\n\nfunc main() {\n    text := "¡Hola, Go!"\n\n    fmt.Println("Recorrido del string por caracteres:")\n    for i, r := range text {\n        fmt.Printf("Posición %d: carácter '%c' (código %U)\\n", i, r, r)\n    }\n}
\n\n

Ten en cuenta: el índice i indica el byte inicial de la runa, no el número de orden del carácter. Para strings con un solo byte

Blogs

Book Recommendations