Espero que este post sea bastante rápido jejejejej.
En este caso hablaremos de los Maps o lo que en otros lenguajes conoceríamos como diccionario. En general siguen las mismas teorías que los arrays o los slices en cuanto a creación y a lo referente al rendimiento, los mapas crecen dinámicamente pero podemos indicarles el tamaño lo que optimizaría un poco su rendimiento.

Creación

Empecemos con la creación. Como ya hemos visto en Go tenemos siempre varias formas de crear los elementos:

  • Forma básica
//var nombreVariable map[tipoClave]tipoValor
var rangerRojo map[string]int
  • Declaración corta:
//Inicializando sin valores
rangerRojo := map[string]int{}

//Inicializando con valores. Obligatoria la coma ultima
rangerVerde := map[string]int{
 "Fuerza": 10000,
 "Resistencia": 5000,
}
  • Usando make
rangerVerde := make(map[string]int)
//Al igual que en los arrays podemos indicar el tamaño para optimizar rendimiento.
rangerNegro := make(map[string]int, 2)  

Usando Map

Ya hemos visto un poco como es la creación de Maps en golang, no es muy complicado no?, veamos ahora algunos detalles de su uso.

Cuando asignamos el valor, realmente este devuelve 2, el contenido que queremos sacar y si existe o no. Veamoslo con un ejemplo:

rangerRojo := map[string]int{
  "Fuerza": 10000,
}

rangerVerde := make(map[string]int)

power, exist := rangerRojo["Fuerza"]
fmt.Println("Valor: ", power, "Existe: ", exist)

power2, exist2 := rangerVerde["Fuerza"]
fmt.Println("Valor: ", power2, "Existe: ", exist2)

He usado dos formas de crear maps y el resultado de esto seria:

Map Exist or Not
Como veis nos inicializa el valor como suele hacer Go y nos indica que no existe realmente.

Borrando contenido de un Map

En este caso Go se vuelve muy útil tiene una función propia para poder eliminar el elemento que queramos:

delete(rangerRojo,"Fuerza")

Probémoslo en un ejemplo más completo:

rangerRojo := map[string]int{
	"Fuerza":      10000,
	"Resistencia": 500,
}
fmt.Println(rangerRojo)

delete(rangerRojo, "Fuerza")

fmt.Println(rangerRojo)

Y como vemos elimina el contenido sin problemas:
Delete in Maps

Recorrer un MAP

Para recorrer un MAP usamos la misma teoría que para los arrays o slices: RANGE vamos directos al ejemplo ya que es bastante simple:

rangerRojo := map[string]interface{}{
  "Fuerza":       10000,
  "Resistencia":  500,
  "Inteligencia": "200",
  "Arma":         "Espada",
}

for key, value := range rangerRojo {
  fmt.Println("Clave: ", key, " Valor: ", value)
}

Tenemos un map que tiene como claves varios strings representando las características de nuestro ranger y como valor he introducido algo que no habiamos visto todavia INTERFACE{}, bueno como resumen haceros a la idea de que es un tipo especial que funciona como un genérico, es decir, que representa cualquier valor(por eso podemos tener valores tipo INT y tipo STRING) y al recorrerlo tenemos esto:
Range over Map
OJO a tener en cuenta, no tiene porque hacerlo en orden sobretodo si introducimos algo a posteriori, mirar un ejemplo:

rangerRojo := map[string]interface{}{
  "Fuerza":       10000,
  "Resistencia":  500,
  "Inteligencia": 150,
  "Arma":         "Espada",
}

rangerRojo["Maná"] = 150

for key, value := range rangerRojo {
  fmt.Println("Clave: ", key, " Valor: ", value)
}

He añadido otra propiedad a nuestro ranger y el resultado es:
First random range test

Si lo ejecuto de nuevo:

Second random range test

Por último y como he adelantado en el ejemplo anterior:

Añadir elementos a nuestro MAP

Bueno como ya hemos visto esto es muy sencillo:

rangerRojo["Maná"] = 150

fmt.Println(rangerRojo)

Y nos muestra
Print add content to map
Por el momento hemos terminado con los mapas, profundizaremos en el trabajo con ellos más adelante.
Sin mucho más nos vemos en la siguiente superNinjas :)