Go Maps
Maps são coleções de chave/valor, permitindo você iterar da mesma forma que você faria com arrays ou slices, porém, por ser coleções não ordenadas, não há como prever a ordem que você receberá os dados. Mesmo se você adicionar os dados em uma certa ordem, não há garantia de tal ordem na hora de resgatar esses dados.
Maps são implementados usando tabela Hash. Não vou entrar em detalhes sobre como funciona uma tabela hash, mas é interessante você saber que para armazenar chave/valor acaba sendo muito mais performático usar uma tabela Hash que armazenar em array usando registros de memória ordenados. Isso porque quando você passar a chave pedindo o valor, será executado uma hash function que recebe a chave e retornará onde está armazenado o registro, isso acontece geralmente em milissegundos em razão O(1).
Criando Maps
Há duas formas de criar maps:
Criando um map de chave string e valor int
dict := make(map[string]int)
Criando um map de chave string e valor string
dictStocks := map[string]string{"tesla": "TSLA", "gamestop": "GME"}
Adicionando um novo elemento ao Map
dictStocks["amazon"] = "AMZN"
Nil maps
Você pode declarar um nil map, mas ao tentar atribuir um novo elemento resultará em Runtime Error.
var myDict map[string]string
myDict["key"] = "value"
panic: assignment to entry in nil map
Verificando chaves
Verificar se uma chave existe faz parte de trabalhar com maps.
Quando solicitamos um valor de uma chave map temos duas opções, receber o valor e uma flag que indica se a chave existe:
dict := make(map[string]string)
valor, existe = dict["chave"]
Nesse exemplo, como declaramos um mapa de chave string e valor string, caso a chave não exista, a variável valor receberá uma string zerada, ou seja uma string vazia “", e existe receberá false. Se o map fosse de valor tipo int, a variável valor receberia 0.
Iterando maps
Iterar em maps é muito semelhante a iterar em slices ou arrays usando range, exceto que não iremos receber índice e valor e sim chave e valor.
stocks := map[string]string{"taesa": "taee11", "unipar": "UNIP6"}
for chave, valor := range(stocks){
...
}
Deletando um item do map
Para deletar uma chave é bem simples:
delete(meuMapa, "chave")
Alterando um map passado como argumento em uma função
Um map passado por um argumento em uma função não cria uma cópia, mantendo a referencia ao map original. Ao realizar uma alteração no map, todas as referencias serão atualizadas.
func deleteMapItem(meuMap map[string]string, indice string){
delete(meuMap, indice)
}
func main() {
stocks := map[string]string{"taesa": "taee11", "unipar": "UNIP6"}
deleteMapItem(stocks, "taesa")
for chave, valor := range(stocks){
fmt.Printf("%s, %s", chave, valor)
}
}
Resultado:
unipar, UNIP6