Saltar al contenido principal
eLearner.app
Módulo 4 · Lección 3 de 518/50 en el curso~12 min
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

Go
// 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          // PANIC

Operaciones básicas

Go
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 entries

Coma-ok: distinguir "valor faltante" de "valor cero"

Go
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

Go
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.

Go
m := map[[2]int]string{}   // ok: array is comparable
// m := map[[]int]string{} // ERROR: slice is not comparable

Patrón: contadores

Uno de los usos más comunes de los mapas:

Go
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

Ejercicio#go.m4.l3.e1
Intentos: 0Cargando...

Cree un map[string]int con los valores 'a' -> 1 y 'b' -> 2, luego agregue 'c' -> 3.

Cargando editor...
Mostrar pista

Literal: CÓDIGOPH0.

Solución disponible después de 3 intentos

Ejercicio#go.m4.l3.e2
Intentos: 0Cargando...

Utilice el patrón coma-ok para leer la clave 'x' (no presente) en v, ok e imprima ambas.

Cargando editor...
Mostrar pista

Dos valores de retorno: el valor y un booleano de presencia.

Solución disponible después de 3 intentos

Cuestionario#go.m4.l3.e3
Listo

¿Qué sucede al escribir en un mapa nulo?

Go
var m map[string]int
m["a"] = 1
Opciones de respuesta

Resumen

  • map[K]V: clave-valor, referencia, con respaldo hash.
  • Inicializar con make o 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 si k no 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.