Capítulo 4. Estructuras de control
Este trabajo se ha traducido utilizando IA. Agradecemos tus opiniones y comentarios: translation-feedback@oreilly.com
Ahora que sabes utilizar variables, es hora de empezar a escribir programas útiles. En primer lugar, vamos a escribir un programa que cuente hasta 10, empezando por 1, con cada número en su propia línea. Utilizando lo que has aprendido hasta ahora, podrías escribir esto:
package
main
import
"fmt"
func
main
()
{
fmt
.
Println
(
1
)
fmt
.
Println
(
2
)
fmt
.
Println
(
3
)
fmt
.
Println
(
4
)
fmt
.
Println
(
5
)
fmt
.
Println
(
6
)
fmt
.
Println
(
7
)
fmt
.
Println
(
8
)
fmt
.
Println
(
9
)
fmt
.
Println
(
10
)
}
O esto:
package
main
import
"fmt"
func
main
()
{
fmt
.
Println
(
`1
2
3
4
5
6
7
8
9
10`
)
}
Pero ambos programas son bastante tediosos de escribir. Lo que necesitamos es una forma de hacer algo varias veces.
La Declaración for
La sentencia for
nos permite repetir una lista de sentencias (un bloque) varias veces. Reescribir nuestro programa anterior utilizando una sentencia for
tiene el siguiente aspecto:
package
main
import
"fmt"
func
main
()
{
i
:=
1
for
i
<=
10
{
fmt
.
Println
(
i
)
i
=
i
+
1
}
}
En primer lugar, creamos una variable llamada i
que utilizamos para almacenar el número que queremos imprimir. A continuación, creamos un bucle for
utilizando la palabra clave for
, proporcionando una expresión condicional que sea true
o false
y, por último, proporcionando un bloque para ejecutar. El bucle for
funciona así:
-
Evaluamos (ejecutamos) la expresión
i <= 10
("i menor o igual que 10"). Si el resultado es verdadero, ejecutamos las sentencias del bloque. En caso contrario, saltamos a la siguiente línea de nuestro programa después del bloque (en este caso, no hay nada después del buclefor
, así que salimos del programa). -
Después de ejecutar las sentencias dentro del bloque, volvemos al principio de la sentencia
for
y repetimos el paso 1.
La línea i = i + 1
es extremadamente importante, porque sin ella, i <= 10
siempre se evaluaría a true
y nuestro programa nunca se detendría (cuando esto ocurre, se denomina bucle infinito).
Como ejercicio, vamos a recorrer el programa como lo haría un ordenador:
-
Crea una variable llamada
i
con el valor 1. -
¿Es
i <= 10
? Sí. -
Imprimir
i
. -
Ajusta
i
ai + 1
(i
ahora es igual a 2). -
¿Es
i <= 10
? Sí. -
Imprimir
i
. -
Ajusta
i
ai + 1
(i
ahora es igual a 3). -
...
-
Pon
i
eni + 1
(i
es ahora igual a 11). -
¿Es
i <= 10
? No. -
No queda nada por hacer, así que sal.
Otros lenguajes de programación tienen muchos tipos diferentes de bucles (while
, do
, until
, foreach
, ...) pero Go sólo tiene uno que se puede utilizar de muchas formas diferentes. El programa anterior también podría haberse escrito así:
func
main
()
{
for
i
:=
1
;
i
<=
10
;
i
++
{
fmt
.
Println
(
i
)
}
}
Ahora la expresión condicional también contiene otras dos declaraciones con punto y coma entre ellas. En primer lugar, tenemos la inicialización de la variable, después tenemos la condición a comprobar cada vez y, por último, incrementamos la variable . Sumar 1 a una variable es tan común que tenemos un operador especial (++
); del mismo modo, restar 1 puede hacerse con --
.
Veremos otras formas de utilizar el bucle for
en capítulos posteriores.
La declaración if
Modifiquemos el programa que acabamos de escribir para que, en lugar de limitarse a imprimir los números del 1 al 10 en cada línea, especifique también si el número es par o impar:
1
odd
2
even
3
odd
4
even
5
odd
6
even
7
odd
8
even
9
odd
10
even
En primer lugar, necesitamos una forma de determinar si un número es par o impar. Una forma fácil de saberlo es dividir el número por 2. Si no te queda nada, entonces el número es par; de lo contrario, es impar. Entonces, ¿cómo hallamos el resto tras la división en Go? Utilizamos el operador %
. 1 % 2
es igual a 1
, 2 % 2
es igual a 0
, 3 % 2
es igual a 1
, y así sucesivamente.
A continuación, necesitamos una forma de elegir hacer cosas diferentes en función de una condición. Para ello, utilizamos la sentencia if
:
if
i
%
2
==
0
{
// even
}
else
{
// odd
}
Una sentencia if
es similar a una sentencia for
en que tiene una condición seguida de un bloque. Las sentencias if
también tienen una parte opcional else
. Si la condición se evalúa como verdadera, se ejecuta el bloque que sigue a la condición; en caso contrario, se omite el bloque o, si el bloque else
está presente, se ejecuta ese bloque.
if
Las declaraciones también pueden tener partes else if
:
if
i
%
2
==
0
{
// divisible by 2
}
else
if
i
%
3
==
0
{
// divisible by 3
}
else
if
i
%
4
==
0
{
// divisible by 4
}
Las condiciones se comprueban de arriba abajo y el bloque asociado al primero que resulte verdadero se ejecutará. Ninguno de los otros bloques se ejecutará, aunque sus condiciones también se cumplan (así, por ejemplo, el número 8 es divisible por 4 y por 2, pero el bloque // divisible by 4
nunca se ejecutará porque el bloque // divisible by 2
se ejecuta primero).
Juntándolo todo, tenemos
func
main
()
{
for
i
:=
1
;
i
<=
10
;
i
++
{
if
i
%
2
==
0
{
fmt
.
Println
(
i
,
"even"
)
}
else
{
fmt
.
Println
(
i
,
"odd"
)
}
}
}
Recorramos este programa:
-
Crea una variable
i
de tipoint
y dale el valor1
. -
¿Es
i
menor o igual que10
? Sí: salta al bloqueif
. -
¿Es el resto de
i
÷2
igual a0
? No: salta al bloqueelse
. -
Imprime
i
seguido deodd
. -
Incrementa
i
(la declaración después de la condición). -
¿Es
i
menor o igual que10
? Sí: salta al bloqueif
. -
¿Es el resto de
i
÷2
igual a0
? Sí: salta al bloqueif
. -
Imprime
i
seguido deeven
, y así sucesivamente hasta quei
sea igual a 11. -
...
El operador resto, aunque rara vez se ve fuera de la escuela primaria, resulta ser realmente útil al programar. Lo verás aparecer en todas partes, desde las tablas de bandas de cebra hasta la partición de conjuntos de datos.
if
son bastante útiles, pero en ocasiones pueden ser bastante verbosas, por lo que Go incluye una sentencia relacionada: la switch
.
La Declaración del interruptor
Supón que quieres escribir un programa que imprima los nombres en inglés de los números. Utilizando lo que has aprendido hasta ahora, podrías empezar haciendo lo siguiente:
if
i
==
0
{
fmt
.
Println
(
"Zero"
)
}
else
if
i
==
1
{
fmt
.
Println
(
"One"
)
}
else
if
i
==
2
{
fmt
.
Println
(
"Two"
)
}
else
if
i
==
3
{
fmt
.
Println
(
"Three"
)
}
else
if
i
==
4
{
fmt
.
Println
(
"Four"
)
}
else
if
i
==
5
{
fmt
.
Println
(
"Five"
)
}
Escribir un programa de esta forma sería bastante tedioso, así que otra forma de conseguir el mismo resultado es utilizar la sentencia switch
. Podemos reescribir nuestro programa de la siguiente manera:
switch
i
{
case
0
:
fmt
.
Println
(
"Zero"
)
case
1
:
fmt
.
Println
(
"One"
)
case
2
:
fmt
.
Println
(
"Two"
)
case
3
:
fmt
.
Println
(
"Three"
)
case
4
:
fmt
.
Println
(
"Four"
)
case
5
:
fmt
.
Println
(
"Five"
)
default
:
fmt
.
Println
(
"Unknown Number"
)
}
Una sentencia switch
comienza con la palabra clave switch
seguida de una expresión (en este caso, i
) y, a continuación, una serie de case
s. El valor de la expresión se compara con la expresión que sigue a cada palabra clave case
. Si son equivalentes, se ejecutan las sentencias que siguen a la :
.
Al igual que una sentencia if
, cada caso se comprueba de arriba abajo y se elige el primero que tenga éxito. Un conmutador también admite un caso por defecto que ocurrirá si ninguno de los casos coincide con el valor (de forma similar a como funciona else
en una sentencia if
).
for
, if
, y switch
son las principales sentencias de flujo de control. En capítulos posteriores se estudiarán otras sentencias.
Ejercicios
-
¿Qué imprime el siguiente programa?
i
:=
10
if
i
>
10
{
fmt
.
Println
(
"Big"
)
}
else
{
fmt
.
Println
(
"Small"
)
}
-
Escribe un programa que imprima todos los números entre 1 y 100 que sean divisibles por 3 (es decir, 3, 6, 9, etc.).
-
Escribe un programa que imprima los números del 1 al 100, pero para los múltiplos de tres, imprima "Fizz" en lugar del número, y para los múltiplos de cinco, imprima "Buzz". Para los números que sean múltiplos tanto de tres como de cinco, imprime "FizzBuzz".
Get Presentación de Go now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.