Lecciones del módulo (3/5)
Maps: claves y valores
Un mapa es una tabla hash clave→valor: map[K]V. Los mapas son referencia
tipos: pasados a una función, comparten el mismo almacenamiento. Deben ser
inicializados antes de poder escribirles (con make o un literal).
Creación
// with a literal
prices := map[string]int{"pane": 2, "latte": 3}
// with make
counters := make(map[string]int)
counters["a"] = 1
// nil map (readable, NOT writable)
var m map[string]int
fmt.Println(m["x"]) // 0 — ok
// m["y"] = 1 // PANICOperaciones básicas
m := map[string]int{"a": 1}
m["b"] = 2 // insert/update
v := m["a"] // get; if missing: zero value
delete(m, "a") // remove (ok even if the key doesn't exist)
n := len(m) // number of entriesComa-ok: distinguir "valor faltante" de "valor cero"
v, ok := m["x"]
if !ok {
fmt.Println("key missing")
} else {
fmt.Println("found:", v)
}Es la única manera de saber si existe una clave, porque m["x"] devuelve
el valor cero incluso cuando la clave no está allí. Un patrón fundamental.
Iteración: orden aleatorio
for k, v := range m {
fmt.Println(k, v)
}Claves: sólo tipos comparables
Las claves deben ser comparables: string, números, bool, punteros,
canales, interfaces, matrices de tipos comparables, estructuras de comparables
campos. Los sectores, mapas y funciones no son comparables → no pueden
ser llaves.
m := map[[2]int]string{} // ok: array is comparable
// m := map[[]int]string{} // ERROR: slice is not comparablePatrón: contadores
Uno de los usos más comunes de los mapas:
words := []string{"a", "b", "a", "c", "b", "a"}
freq := map[string]int{}
for _, w := range words {
freq[w]++ // access to a missing key is 0 → 0+1 = 1
}
// freq = {"a": 3, "b": 2, "c": 1}Pruébalo
Cree un map[string]int con los valores 'a' -> 1 y 'b' -> 2, luego agregue 'c' -> 3.
Mostrar pista
Literal: CÓDIGOPH0.
Solución disponible después de 3 intentos
Utilice el patrón coma-ok para leer la clave 'x' (no presente) en v, ok e imprima ambas.
Mostrar pista
Dos valores de retorno: el valor y un booleano de presencia.
Solución disponible después de 3 intentos
¿Qué sucede al escribir en un mapa nulo?
var m map[string]int
m["a"] = 1Resumen
map[K]V: clave-valor, referencia, con respaldo hash.- Inicializar con
makeo un literal; mapa nulo → pánico al escribir. v, ok := m[k]es la única forma de distinguir el "valor faltante" del "valor cero".- Elimina
delete(m, k); ok incluso sikno existe. - Iteración
range: orden aleatorio. - Claves: solo tipos comparables (sin corte/mapa/función).
- Patrón de contadores:
freq[k]++aprovecha el valor cero implícito.