lunes, 12 de noviembre de 2018

Mapas en Go

Un mapa es un tipo de colección dinámico que está referenciado por una clave, en lugar de por un índice. Su concepto es muy similar al de un diccionario en otros lenguajes de programación.

Hay dos formas de declarar y crear un mapa en Go:

var variableMapa map[tipoClave]tipoValor

variableMapa := make(map[tipoClave]tipoValor

Para añadir o modificar elementos del mapa, basta con indicar la clave y el valor para dicha clave. Si la clave no existe en el mapa, la añade; si ya existe, le cambia el valor.

variableMapa[clave] = valor

Para eliminar un elemento del mapa, se utiliza la función delete():

delete(variableMapa, clave)

Para saber si existe un elemento en el mapa, accederemos a dicho elemento, el cual nos devolverá dos valores: la propia clave y un valor boolean con el valor true si existe, o false si no existe:

var1, var2 = variableMapa[clave]
_, var = variableMapa[clave]

Nota: El uso del carácter subrayado (_) permite omitir un valor retornado, en este caso el nombre de la propia clave.

Si queremos recorrer uno a uno los elementos utilizaremos un bucle for alimentado por un rango mediante range, al cual indicaremos el mapa.

for varClave, varValor := range variableMapa {
   ...
}

Nota: El bloque for se repetirá por cada uno de los elementos del mapa. El propio bucle obtendrá, de cada elemento, dos variables: la clave y el valor. También podemos hacer uso del carácter subrayado (_) para omitir uno de estos valores.

Ejemplo

El siguiente ejemplo muestra los conceptos vistos anteriormente sobre los mapas en Go.

package main

import "fmt"

func main() {
   // Definicion del mapa
   centros := make(map[string]string)

   // Adicion de claves y valores
   centros["MADE"] = "Madrid Este"
   centros["MADN"] = "Madrid Norte"
   centros["MOS"] = "Mostoles"
   centros["POZ"] = "Pozuelo"
   centros["BCN"] = "Barcelona"

   // Visualizacion de propiedades y valores
   fmt.Println("Centros: ", centros)
   fmt.Println("Total: ", len(centros))
   fmt.Println("MOS: ", centros["MOS"])

   // Cambio de un elemento por su clave
   centros["POZ"] = "Pozoblanco"

   // Eliminacion de un elemento por su clave
   delete(centros, "MADN")

   // Visualizacion de propiedades y valores
   fmt.Println("Centros: ", centros)
   fmt.Println("Total: ", len(centros))

   // Verificar si existe (hay) valor para un elemento
   clave, existe := centros["MOS"]
   fmt.Printf("Clave: %s, existe: %v\n", clave, existe)
   _, existe = centros["ZZZ"]
   fmt.Printf("existe: %v\n", existe)

   // Recorrido del mapa
   for key, value := range centros {
      fmt.Printf("Key: %s, Value: %s\n", key, value)
   }
}

Nota: Los elemetos del mapa no están ordenados. Cuando se accede al mapa, estos elementos pueden estar en diferentes posiciones.

El resultado del programa será el siguiente:

$ go run maps.go
Centros:  map[MADE:Madrid Este MADN:Madrid Norte 
MOS:Mostoles POZ:Pozuelo BCN:Barcelona]
Total:  5
MOS:  Mostoles
Centros:  map[MOS:Mostoles POZ:Pozoblanco BCN:Barcelona 
MADE:Madrid Este]
Total:  4
Clave: Mostoles, existe: true
existe: false
Key: BCN, Value: Barcelona
Key: MADE, Value: Madrid Este
Key: MOS, Value: Mostoles
Key: POZ, Value: Pozoblanco

Enlaces de interés

No hay comentarios:

Publicar un comentario