En Go, map es un tipo de datos integrado que asigna claves a valores.
En otros lenguajes de programación, puede que conozcas el concepto de map como diccionario, tabla hash, almacén clave/valor o array asociativo.
Desde el punto de vista sintáctico, map tiene este aspecto:
map[KeyType]ElementType
También es importante saber que cada clave es única, lo que significa que asignar la misma clave dos veces sobrescribirá el valor de la clave correspondiente.
Para crear un map, puedes hacer lo siguiente:
// With map literal
foo := map[string]int{}
o
// or with make function
foo := make(map[string]int)
Aquí tienes algunas operaciones que puedes hacer con un map
// Add a value in a map with the `=` operator:
foo["bar"] = 42
// Here we update the element of `bar`
foo["bar"] = 73
// To retrieve a map value, you can use
baz := foo["bar"]
// To delete an item from a map, you can use
delete(foo, "bar")
Si intentas obtener el valor de una clave que no existe en el map, se devolverá el valor cero del tipo del valor.
Esto puede confundirte, sobre todo si el valor predeterminado de tu ElementType (por ejemplo, 0 para un int) es un valor válido.
Para comprobar si una clave existe en tu map, puedes usar
value, exists := foo["baz"]
// If the key "baz" does not exist,
// value: 0; exists: false
Un amigo tuyo tiene una vieja tienda mayorista llamada Gross Store. El nombre viene de la cantidad del artículo que vende la tienda: todo se mide en gruesas. Tu amigo te pidió que implementaras un sistema de punto de venta (POS) para su tienda. Primero, quieres crear un prototipo. En tu prototipo, tu sistema solo registrará la cantidad. Tu amigo te ha dado una lista de medidas para ayudarte:
| Unidad | Valor |
|---|---|
| quarter_of_a_dozen | 3 |
| half_of_a_dozen | 6 |
| dozen | 12 |
| small_gross | 120 |
| gross | 144 |
| great_gross | 1728 |
Para poder usar la medida, necesitas guardar la medida en tu programa.
units := Units()
fmt.Println(units)
// Output: map[...] with entries like ("dozen": 12)
Necesitas implementar una función que cree una nueva factura (vacía) para el cliente.
bill := NewBill()
fmt.Println(bill)
// Output: map[]
Para implementar esto, tendrás que:
false si la unit dada no está en el mapa units.bill del cliente, indexado por el nombre del artículo, y luego devolver true.unit proporcionada.bill := NewBill()
units := Units()
ok := AddItem(bill, units, "carrot", "dozen")
fmt.Println(ok)
// Output: true (since dozen is a valid unit)
Ten en cuenta que el valor devuelto es de tipo
bool.
Para implementar esto, tendrás que:
false si el artículo dado no está en la factura.false si la unit dada no está en el mapa units.false si la nueva cantidad fuera menor que 0.bill y luego devolver true.true.bill := NewBill()
units := Units()
ok := RemoveItem(bill, units, "carrot", "dozen")
fmt.Println(ok)
// Output: false (because there are no carrots in the bill)
Ten en cuenta que el valor devuelto es de tipo
bool.
Para implementar esto, tendrás que:
0 y false si el item no está en la factura.bill y true.bill := map[string]int{"carrot": 12, "grapes": 3}
qty, ok := GetItem(bill, "carrot")
fmt.Println(qty)
// Output: 12
fmt.Println(ok)
// Output: true
Ten en cuenta que los valores devueltos son de tipo
intybool.
Regístrate en Exercism para aprender y dominar Go con 34 conceptos165 ejercicios y mentoría humana real, todo gratis.