Go prepara pacotes de coleções genéricas na biblioteca padrão para o Go 1.28
Um grupo de trabalho do projeto Go propôs adicionar tipos como Set, Map ordenado e um novo heap genérico à stdlib, com sets deixando de depender de map[T]bool.

O projeto Go publicou uma proposta guarda-chuva (issue #80590) reunindo várias APIs de coleções genéricas para a biblioteca padrão, com alvo no Go 1.28. A issue foi aberta por Alan Donovan e detalha o trabalho do Go Collections working group, formado no fim de 2025.
Segundo a proposta, o grupo é composto por Jonathan Amsterdam, Alan Donovan, Robert Griesemer, Daniel Martí, Roger Peppe, Keith Randall e Ian Lance Taylor. O documento parte de uma constatação: hoje o Go oferece poucos tipos de coleção na stdlib, apostando na flexibilidade de slice e map embutidos. O tipo mais relevante disponível é o heap, usado em filas de prioridade. Conjuntos (sets) estão ausentes e, por convenção, são expressos como map[T]bool ou map[T]struct{}. Mapas e conjuntos ordenados baseados em árvores binárias também não existem.
O que muda desde os genéricos e iteradores
A proposta observa que, com os genéricos (Go 1.18) e os iteradores (Go 1.23), tipos definidos em biblioteca já conseguem ergonomia comparável à dos tipos embutidos. É esse o gancho técnico para trazer as estruturas para a stdlib e, ao mesmo tempo, estabelecer convenções de API para futuras adições.
O que está sendo proposto
A issue linka várias propostas concretas e seus CLs de implementação:
hash/maphash.Hasher(#70471, já liberado no go1.27): interface padrão para funções de hash e relações de equivalência customizadas, útil quando a chave não é comparável (como slices ou maps).container/hash.Map[K,V](#69559) econtainer/hash.Set[T](#80584): Map e Set baseados nas funções de hash customizadas.container/set.Set[T](#69230): o tipo canônico de conjunto para elementos comparáveis, representado de forma transparente comomap[T]struct{}e com operações comoUnioneIntersection. O grupo espera que ele vire o set padrão na maioria das novas APIs Go, evitando a ambiguidade de valoresfalseemmap[T]bool.container/mapset(#77052): funções auxiliares (Union, Intersection etc.) para manipular sets "legados" em código cuja API não pode mudar.container/ordered.Map[K,V](#60630): mapeamento ordenado, com implementação atual em árvore binária balanceada, útil em cenários como consultas por intervalo (range queries).container/heap/v2.Heap(#77397): API de heap binário genérica para substituir o heap atual da stdlib, que a proposta descreve como "difícil de usar".
Mapas ordenados por inserção (#80194) e stacks são citados como possíveis adições futuras.
Um detalhe de nomenclatura: apesar de os novos pacotes viverem na árvore container, o grupo prefere o termo "collection" para evitar confusão com o conceito de containers do Linux.
Decisões de design que valem a leitura
A proposta expõe várias racionalizações que interessam a quem escreve código de infra e backend:
- Métodos de mutação geralmente reportam se mudaram o tamanho da coleção, e
Map.Set/Map.Deleteretornam a chave anterior mais um booleano para distinguir chave existente de valor zero. - Operações de álgebra de conjuntos como
Unionsão puramente funcionais (retornam um novo set), com uma variante-Withque muta o operando à esquerda. O grupo diz ter rejeitado a fusão das duas com base na experiência da APImath/big.Inte no risco de mutação acidental ou de esquecer o resultado. DeleteFuncfoi mantido na interface porque, sem ele, apagar condicionalmente elementos de uma árvore seria assintoticamente pior: O(n log n) em vez de O(n). JáSubsetficou de fora, expresso como operação genérica sobre sets abstratos.
O documento também descreve interfaces de constraint abstratas (_AbstractCollection, _AbstractMap, _AbstractSet), que lidam com o chamado binary method problem via polimorfismo F-bounded (constraints recursivas). Por ora essas interfaces são não exportadas e servem apenas como documentação e garantia de conformância em testes; a publicação pode vir num release futuro, depois da experiência prática com os tipos concretos.
O que observar por aqui
Para quem constrói software no Brasil e usa Go em produção, especialmente em times de backend e plataforma, a mudança promete reduzir boilerplate recorrente: acaba a gambiarra de map[T]bool para conjuntos e chega um heap mais amigável. Vale lembrar que se trata de proposta, ainda em discussão no processo do Go, com alvo no marco Go1.28. Os detalhes de API e os CLs estão linkados nas issues individuais para acompanhamento.
Fonte: Hacker News
Este artigo foi escrito por Redação iMasters, um agente de inteligência artificial com revisão editorial humana.









