DMarlon Studio

Lección 11 · 11 de 20

Mapas · Go

Guarde pares clave-valor en un mapa de Go: añadir, leer con ok, delete y len, y escribirlo siempre en el mismo orden con sort.Strings.

Go · Mapas en DMarlon Studio: el código del ejemplo y su salida en la terminal

Un mapa relaciona claves con valores. map[string]int tiene claves de texto y valores enteros, y el literal los empareja con dos puntos: "apples": 12. Para leer se pone la clave entre corchetes: stock["apples"] da 12.

Asignar a una clave cambia su valor si ya existe (pears pasa a 8) y la crea si no existe (kiwis). Leer una clave que no está no falla: da el valor cero del tipo, 0. Para saber si de verdad existe, se pide un segundo valor: _, ok := stock["bananas"] deja ok en false.

delete(stock, "plums") borra una clave con su valor, y len(stock) cuenta las que quedan: 3.

El orden de un mapa en Go es aleatorio a propósito: cada ejecución puede recorrerlo de otra manera. Para escribirlo siempre igual, se reúnen las claves en un slice con for key := range stock (la lección 18 explica range), se ordenan con sort.Strings(keys) y se recorren en ese orden, leyendo cada valor con stock[keys[i]].

Código · main.go

package mainimport (	"fmt"	"sort")func main() {	// A map links keys to values: map[keyType]valueType.	stock := map[string]int{"apples": 12, "pears": 5, "plums": 0}	fmt.Println("Apples:", stock["apples"])	// Assigning changes a value or adds a new key.	stock["pears"] = 8	stock["kiwis"] = 20	// A missing key gives the zero value; ok says if it exists.	fmt.Println("Bananas:", stock["bananas"])	if _, ok := stock["bananas"]; !ok {		fmt.Println("We do not sell bananas")	}	delete(stock, "plums")	fmt.Println("Kinds of fruit:", len(stock))	// The order of a map is random: sort the keys first.	keys := make([]string, 0, len(stock))	for key := range stock {		keys = append(keys, key)	}	sort.Strings(keys)	for i := 0; i < len(keys); i++ {		fmt.Printf("%-8s%4d\n", keys[i], stock[keys[i]])	}}

Salida · go run main.go

Apples: 12
Bananas: 0
We do not sell bananas
Kinds of fruit: 3
apples    12
kiwis     20
pears      8

Para recordar

  • map[clave]valor relaciona claves con valores.
  • m[k] = v cambia o añade; delete(m, k) borra.
  • Una clave que no existe da el valor cero.
  • v, ok := m[k] dice si la clave existe.
  • El orden de un mapa es aleatorio: ordene las claves con sort.Strings.

Ejercicio

Añada un mapa prices con el precio de cada fruta y escriba, en orden alfabético, cada fruta con el valor de sus existencias (float64(stock[k]) * prices[k]) y el total al final.