Estruturas de Dados
Embora a sintaxe do Go seja simples, ele possui várias estruturas de dados principais poderosas. Essas estruturas de dados são os blocos de construção básicos dos programas Go. Compreender profundamente seus princípios de implementação ajuda a escrever código mais eficiente. Este artigo apresenta várias das estruturas de dados mais usadas no Go e suas implementações subjacentes.
Estruturas de Dados Básicas
slice Slice
O slice é a estrutura de dados mais usada no Go, sendo uma abstração e encapsulamento de arrays. Principais características:
- Tamanho Dinâmico: O comprimento do slice pode crescer dinamicamente
- Semântica de Referência: Ao passar um slice, apenas a estrutura é copiada, não o array subjacente
- Mecanismo de Expansão: Expande automaticamente quando a capacidade é insuficiente
O slice é representado em tempo de execução pela estrutura slice, contendo três campos: ponteiro para o array subjacente, comprimento e capacidade.
string String
A string é um dos tipos de dados mais básicos no Go. Principais características:
- Imutabilidade: Uma vez criada, a string não pode ser modificada
- Codificação UTF-8: Geralmente representa texto codificado em UTF-8
- Segurança do Valor Zero: O valor zero da string é uma string vazia
"", nãonil
A string é representada em tempo de execução pela estrutura stringStruct, contendo um ponteiro para um array de bytes e o comprimento.
Estruturas de Dados de Contêiner
map Mapeamento
O map é um contêiner de pares chave-valor integrado no Go, implementado usando uma tabela hash. Principais características:
- Implementação com Tabela Hash: Localiza elementos rapidamente através de funções hash
- Expansão Automática: Expande automaticamente quando o fator de carga é muito alto
- Não Seguro para Concorrência: Leitura e escrita concorrentes requerem mecanismos de sincronização adicionais
O map é representado em tempo de execução pela estrutura hmap, contendo array de buckets, semente hash, contagem de elementos e outros campos.
syncmap Mapeamento Concorrente
O sync.Map é um mapeamento seguro para concorrência fornecido pela biblioteca padrão, adequado para cenários com muitas leituras e poucas escritas. Principais características:
- Separação de Leitura/Escrita: Usa dois maps, read e dirty, para separar leitura e escrita
- Operações Atômicas: O map read usa operações atômicas, sem necessidade de bloqueio
- Migração Progressiva: Quando a contagem miss atinge o limiar, o dirty é promovido para read
O sync.Map troca espaço por tempo, fornecendo melhor desempenho que map + mutex em cenários específicos.
Estruturas de Dados Concorrentes
channel Canal
O channel é um representante típico do modelo CSP do Go, usado para comunicação entre goroutines. Principais características:
- Comunicação entre Goroutines: Permite passagem de dados entre goroutines através do channel
- Mecanismo de Sincronização: Channels sem buffer podem ser usados para sincronização de goroutines
- Fila com Bloqueio: Subjacente é uma fila circular com bloqueio
O channel é representado em tempo de execução pela estrutura hchan, contendo buffer circular, filas de espera e outros campos.
select Múltiplexação
O select pode monitorar o estado de múltiplos channels simultaneamente, implementando múltiplexação. Principais características:
- Não Bloqueante: Pode verificar de forma não bloqueante se múltiplos channels estão disponíveis
- Seleção Aleatória: Quando múltiplos channels estão disponíveis, escolhe aleatoriamente um para executar
- Controle de Timeout: Funciona com
time.Afterpara implementar mecanismos de timeout
O select é representado em tempo de execução pela estrutura scase para cada branch, verificando o estado do channel através de um mecanismo de polling.
Sugestões de Aprendizado
Recomenda-se seguir a seguinte ordem de aprendizado:
- Primeiro aprenda slice Slice e string String, compreenda as estruturas de dados básicas
- Em seguida aprenda map Mapeamento, entenda a implementação da tabela hash
- Depois aprenda channel Canal, compreenda o mecanismo de comunicação entre goroutines
- Em seguida aprenda select Múltiplexação, domine as técnicas de múltiplexação
- Finalmente aprenda syncmap Mapeamento Concorrente, entenda os métodos de implementação seguros para concorrência
