Em Go, map é um tipo de dados incorporado que associa chaves a valores.
Noutras linguagens de programação, podes estar familiarizado com o conceito de map como um dicionário, uma tabela de hash, um armazenamento de chave/valor ou um array associativo.
Sintaticamente, map tem este aspeto:
map[KeyType]ElementType
É também importante saber que cada chave é única, ou seja, atribuir a mesma chave duas vezes sobrescreve o valor da chave correspondente.
Para criar um map, podes fazer:
// With map literal
foo := map[string]int{}
ou
// or with make function
foo := make(map[string]int)
Aqui estão algumas operações que podes fazer com um 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")
Se tentares obter o valor de uma chave que não existe no map, este devolve o valor zero do tipo do valor.
Isto pode confundir-te, sobretudo se o valor predefinido do teu ElementType (por exemplo, 0 para um int) for um valor válido.
Para verificar se uma chave existe no teu map, podes usar
value, exists := foo["baz"]
// If the key "baz" does not exist,
// value: 0; exists: false
Um amigo teu tem uma loja grossista antiga chamada Gross Store. O nome vem da quantidade de artigos que a loja vende: é tudo vendido em grosas. O teu amigo pediu-te para implementares um sistema de ponto de venda (POS) para a loja. Primeiro, queres criar um protótipo para ele. No teu protótipo, o sistema só vai registar a quantidade. O teu amigo deu-te uma lista de medidas para te ajudar:
| Unidade | Valor |
|---|---|
| quarter_of_a_dozen | 3 |
| half_of_a_dozen | 6 |
| dozen | 12 |
| small_gross | 120 |
| gross | 144 |
| great_gross | 1728 |
Para usares a medida, precisas de a guardar no teu programa.
units := Units()
fmt.Println(units)
// Output: map[...] with entries like ("dozen": 12)
Precisas de implementar uma função que cria uma nova conta (vazia) para o cliente.
bill := NewBill()
fmt.Println(bill)
// Output: map[]
Para implementares isto, vais precisar de:
false se a unit indicada não estiver no mapa units.bill do cliente, indexado pelo nome do artigo, e devolver true.unit indicada.bill := NewBill()
units := Units()
ok := AddItem(bill, units, "carrot", "dozen")
fmt.Println(ok)
// Output: true (since dozen is a valid unit)
Repara que o valor devolvido é do tipo
bool.
Para implementares isto, vais precisar de:
false se o artigo indicado não estiver na conta.false se a unit indicada não estiver no mapa units.false se a nova quantidade for inferior a 0.bill e 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)
Repara que o valor devolvido é do tipo
bool.
Para implementares isto, vais precisar de:
0 e false se o item não estiver na conta.bill e true.bill := map[string]int{"carrot": 12, "grapes": 3}
qty, ok := GetItem(bill, "carrot")
fmt.Println(qty)
// Output: 12
fmt.Println(ok)
// Output: true
Repara que os valores devolvidos são dos tipos
intebool.
Inscreve-te no Exercism para aprenderes e dominares Go com 34 conceitos165 exercícios, e mentoria humana real, tudo grátis.