En Go, puedes iterar sobre un slice usando 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/clave y una copia del elemento en ese índice/clave.
Pan comido: los bucles sobre un slice están ordenados como se espera.
xi := []int{10, 20, 30}
for i, x := range xi {
fmt.Println(i, x)
}
// outputs:
// 0, 10
// 1, 20
// 2, 30
Iterar sobre un map 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 en la declaración del map 9 10 sea el primero en imprimirse y no el último.
Sin embargo, los maps no tienen orden por naturaleza, no hay un primer o último par clave/valor.
Por eso, al iterar sobre las entradas de un map, el orden en que se visitarán las entradas será aleatorio y no seguirá ningún patrón específico.
Esto significa que la salida anterior es posible, pero podría diferir de lo que obtengas si intentas ejecutar esto tú mismo.
Para obtener más información, consulta Especificación del lenguaje Go: cláusula range.
En Go, una variable no utilizada generará 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 reemplazar la i con _, lo que le dice 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 reemplazar la x con _,
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 tipo nuevo con nombre, distinto de cualquier otro tipo, incluso de uno con el mismo tipo subyacente.
type File []bool
Aquí, File se refiere a una sola 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 marca 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 Boolean que representa las casillas de una columna del tablero.
Sin estas definiciones de tipo, board sería un map[string][]bool, lo que haría más difícil entender qué estamos representando.
Como aficionado al ajedrez, te gustaría escribir tu propia versión del juego. Sí, puede que ya existan muchas implementaciones de ajedrez disponibles en línea, ¡pero la tuya será única!
Cada casilla del tablero de ajedrez se identifica con un par letra-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 conteo de cero (0) si la columna dada no se puede encontrar 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 dada.
Devuelve un número entero.
Devuelve un conteo de cero (0) si la fila dada no es válida (no está entre 1 y 8, inclusive).
CountInRank(board, 2)
// => 1
Implementa la función CountAll(board Chessboard) int.
Debe contar cuántas casillas hay en el tablero de ajedrez y devuelve un número entero.
Como no necesitas comprobar el contenido de las casillas, considera usar range omitiendo tanto index como value.
CountAll(board)
// => 64
Implementa la función CountOccupied(board Chessboard) int.
Debe contar cuántas casillas están ocupadas en el tablero de ajedrez.
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.