En Go, map es un tipo de dato integrado que asocia claves a valores.
En otros lenguajes de programación, quizá ya conozcas el concepto de map como diccionario, tabla hash, almacén de clave/valor o array asociativo.
Sintácticamente, map se ve así:
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:
// With map literal
foo := map[string]int{}
o
// or with make function
foo := make(map[string]int)
Estas son 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, obtendrás el valor cero del tipo de 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 tienda mayorista antigua 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 construir un prototipo. En tu prototipo, tu sistema solo registrará la cantidad. Tu amigo te dio 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 usar la medida, necesitas guardarla en tu programa.
units := Units()
fmt.Println(units)
// Output: map[...] with entries like ("dozen": 12)
Necesitas implementar una función que cree una cuenta nueva (vacía) para el cliente.
bill := NewBill()
fmt.Println(bill)
// Output: map[]
Para implementar esto, necesitas:
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, necesitas:
false si el artículo dado no está en la cuenta.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, necesitas:
0 y false si el item no está en la cuenta.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.