En Go, puedes iterar sobre un slice con for y un índice, o puedes usar range.
range también te permite iterar sobre un map.
Cada iteración devuelve dos valores: el índice o la clave, y una copia del elemento situado en ese índice o clave.
Pan comido: los bucles sobre un slice se recorren en el orden esperado.
xi := []int{10, 20, 30}
for i, x := range xi {
fmt.Println(i, x)
}
// outputs:
// 0, 10
// 1, 20
// 2, 30
Iterar sobre un mapa plantea un nuevo problema. Ahora el orden es aleatorio.
hash := map[int]int{9: 10, 99: 20, 999: 30}
for k, v := range hash {
fmt.Println(k, v)
}
// outputs, for example:
// 99 20
// 999 30
// 9 10
Puede parecer que la salida anterior es incorrecta, ya que uno esperaría que el primer par clave/valor de la declaración del mapa, 9 10, fuera el primero en imprimirse y no el último.
Sin embargo, los mapas no tienen orden por naturaleza: no existe un primer ni un último par clave/valor.
Por eso, al iterar sobre las entradas de un mapa, el orden en que se visitan esas entradas es aleatorio y no sigue ningún patrón concreto.
Esto significa que la salida anterior es posible, pero podría diferir de la que obtengas si pruebas a ejecutarlo tú mismo.
Para saber más sobre esto, consulta Especificación del lenguaje Go: cláusula range.
En Go, una variable que no se usa provoca un error en tiempo de compilación. A veces solo necesitas el valor, como en el primer ejemplo:
xi := []int{10, 20, 30}
for i, x := range xi {
fmt.Println(x)
}
// Go build failed: i declared but not used
Puedes sustituir la i por _, lo que le indica al compilador que no usamos ese valor:
xi := []int{10, 20, 30}
for _, x := range xi {
fmt.Println(x)
}
// outputs:
// 10
// 20
// 30
Si solo quieres imprimir el índice, puedes sustituir la x por _,
o simplemente omitir la declaración:
xi := []int{10, 20, 30}
// for i, _ := range xi {
for i := range xi {
fmt.Println(i)
}
// outputs:
// 0
// 1
// 2
Una definición de tipo crea un nuevo tipo con nombre, distinto de cualquier otro tipo, incluso de uno con el mismo tipo subyacente.
type File []bool
Aquí File hace referencia a una única columna vertical de un tablero de ajedrez, que normalmente se etiqueta de la A a la H.
Cada casilla de esta columna se representa con un valor Boolean que indica si está ocupada o no.
Ahora que File está definido, podemos usarlo dentro de otras definiciones:
type Chessboard map[string]File
board := Chessboard{
"A": File{true, false, true},
"B": File{false, true, false},
}
Chessboard asigna identificadores de columna a valores File.
Cada File es un slice de valores Boolean que representa las casillas de una columna del tablero.
Sin estas definiciones de tipo, board sería un map[string][]bool, lo que dificultaría entender qué estamos representando.
Como aficionado al ajedrez, te gustaría escribir tu propia versión del juego. Sí, puede que ya haya muchas implementaciones de ajedrez disponibles en internet, ¡pero la tuya será única!
Cada casilla del tablero se identifica con un par de letra y número:
A B C D E F G H
8 # _ _ _ # _ _ # 8
7 _ _ _ _ _ _ _ _ 7
6 _ _ _ _ # _ _ # 6
5 _ # _ _ _ _ _ # 5
4 _ _ _ _ _ _ # # 4
3 # _ # _ _ _ _ # 3
2 _ _ _ _ _ _ _ # 2
1 # _ _ _ _ _ _ # 1
A B C D E F G H
Implementa la función CountInFile(board Chessboard, file string) int.
Debe contar el número total de casillas ocupadas recorriendo un mapa.
Devuelve un número entero.
Devuelve un recuento de cero (0) si la columna indicada no se encuentra en el mapa.
CountInFile(board, "A")
// => 3
Implementa la función CountInRank(board Chessboard, rank int) int.
Debe contar el número total de casillas ocupadas recorriendo la fila indicada.
Devuelve un número entero.
Devuelve un recuento de cero (0) si la fila indicada no es válida (no está entre 1 y 8, ambos inclusive).
CountInRank(board, 2)
// => 1
Implementa la función CountAll(board Chessboard) int.
Debe contar cuántas casillas hay en el tablero y devolver un número entero.
Como no necesitas comprobar el contenido de las casillas, considera usar range omitiendo tanto el index como el value.
CountAll(board)
// => 64
Implementa la función CountOccupied(board Chessboard) int.
Debe contar cuántas casillas están ocupadas en el tablero.
Devuelve un número entero.
CountOccupied(board)
// => 15
Regístrate en Exercism para aprender y dominar Go con 34 conceptos166 ejercicios y mentoría humana real, todo gratis.