> serie: aprende go de 0 a 100 | artículo 3 de 19
Ya tienes tipos y variables del artículo anterior. Hoy tocan las estructuras de control. La noticia: Go tiene menos piezas que cualquier lenguaje que hayas usado. La sorpresa: no vas a echar de menos ninguna.
if: sin paréntesis y con truco
El if de Go prescinde de los paréntesis y exige llaves siempre, tenga una línea o veinte (A Tour of Go, if):
// Sin paréntesis, llaves obligatorias.
if edad >= 18 {
fmt.Println("pasa")
} else {
fmt.Println("fuera")
}
// Con sentencia de inicialización:
// declara, comprueba y limita el scope de una vez.
if v := calcula(); v > umbral {
fmt.Println("v solo existe aquí", v)
}
La segunda forma es oro: la sentencia de inicialización declara una variable que solo vive dentro del if y su else (A Tour of Go, if con declaración). Cuando lleguemos al manejo de errores (artículo 9) verás este patrón hasta en la sopa.
Aviso para navegantes de JS y Java: no hay operador ternario. Es una decisión deliberada para que las condiciones complejas no acaben comprimidas en una línea ilegible (FAQ oficial).
for: el único bucle del lenguaje
Go no tiene while ni do-while ni forEach. Tiene for, y con sus cuatro caras cubre todo (A Tour of Go, for y especificación):
// 1. Clásico
for i := 0; i < 10; i++ {
fmt.Println(i)
}
// 2. Estilo while: solo la condición
for saldo > 0 {
saldo = gasta(saldo)
}
// 3. Infinito: sin nada (sales con break o return)
for {
procesa()
}
// 4. range: colecciones y más
nums := []int{2, 4, 8}
for i, v := range nums {
fmt.Println(i, v)
}
La forma 2 es el while de toda la vida: quitas la inicialización y el incremento y te quedas con la condición.
La forma 4: range, itera slices, maps, strings y channels, y devuelve índice y valor.
El operador range también puede recorrer channels, aunque ese caso lo veremos con calma cuando lleguemos a la concurrencia con goroutines más adelante en la serie.
Si solo quieres el valor, descarta el índice con _, el blank identifier del artículo 2.
Menos piezas, menos decisiones: esa es toda la filosofía que subyace a las estructuras de control de Go. En Python eliges entre for, while y comprehensions. En JS entre for, for…of, for…in, forEach, map… En Go la conversación de code review sobre qué bucle usar dura cero segundos.

switch: sin caídas accidentales
El switch de Go rompe con la tradición de C y Java en lo que más duele, no hay fallthrough implícito. Cada case termina solo, sin break (Effective Go, control structures). Si de verdad quieres caer al siguiente case, existe la palabra fallthrough, explícita y a la vista (especificación).
switch dia {
case "sábado", "domingo": // varios valores por case
fmt.Println("finde")
case "viernes":
fmt.Println("casi")
default:
fmt.Println("a picar código")
}
// Sin expresión: un if/else if legible
switch {
case hora < 12:
fmt.Println("buenos días")
case hora < 21:
fmt.Println("buenas tardes")
default:
fmt.Println("buenas noches")
}
El switch sin expresión es un patrón muy de Go. Cada case es una condición booleana y sustituye a las cadenas largas de if/else if (A Tour of Go, switch). Los cases evalúan de arriba abajo y paran en el primero que acierta. Y sí, también admite sentencia de inicialización, como el if.
Existe también el type switch para preguntar por tipos en vez de valores, pero eso tiene su propio artículo (artículo 7). Y sí, goto existe en el lenguaje. Saber que está ahí y no usarlo también es una buena práctica.
El goto en Go solo salta dentro de la misma función y no puede saltar por encima de declaraciones de variables, así que su margen de maniobra es bastante limitado en la práctica (especificación del lenguaje).
Reto de la semana: Aprovecha las estructuras de control de Go
- El clásico: FizzBuzz del 1 al 100, pero con un switch sin expresión en lugar de if/else.
- Simula una cuenta atrás de lanzamiento con un for estilo while que descuente desde 10.
- Bonus: recorre el string «gopher» con range e imprime índice y carácter. Guarda lo que veas para el artículo 8, donde explicaremos por qué los índices hacen cosas raras con las tildes.
Estructuras de control: nivel completado.
En el próximo artículo: funciones. Varias cosas devueltas a la vez, funciones variádicas y closures.
> exit