Algoritmos Genéricos: Pacotes slices, maps & cmp
Go 1.21 adicionou slices, maps e cmp - pacotes da biblioteca padrão focados em genéricos para ordenação, busca, clonagem e comparação de três vias.
Busque em todas as páginas da documentação
Go 1.21 adicionou slices, maps e cmp - pacotes da biblioteca padrão focados em genéricos para ordenação, busca, clonagem e comparação de três vias.
Use-os antes de helpers customizados; expanda com seus próprios genéricos apenas para a lógica de domínio que eles não cobrem.
slices opera em []E com restrições como cmp.Ordered ou comparable.
maps fornece cópia, exclusão e igualdade para map[K]V.
cmp define Ordered, Compare e Or para construir restrições e comparadores.
Algoritmos customizados seguem os mesmos padrões: um parâmetro de tipo para elementos, parâmetros separados para chaves e valores quando necessário.
Cartão de referência rápida - pronto para copiar e colar.
import (
"cmp"
"slices"
)
func TopN[T cmp.Ordered](data []T, n int) []T {
if n <= 0 {
return nil
}
cp := slices.Clone(data)
slices.Sort(cp)
if n > len(cp) {
n = len(cp)
}
return cp[len(cp)-n:]
}Quando usar isso:
cmp.Ordered em vez de copiar grandes uniões.package main
import (
"cmp"
"fmt"
"maps"
"slices"
)
type User struct {
Name string
Age int
}
func main() {
nums := []int{3, 1, 4, 1, 5}
slices.Sort(nums)
fmt.Println(nums)
fmt.Println(slices.BinarySearch(nums, 4))
m1 := map[string]int{"a": 1, "b": 2}
m2 := maps.Clone(m1)
m2["c"] = 3
fmt.Println(maps.Equal(m1, m2))
users := []User{{"ann", 30}, {"bob", 25}}
slices.SortFunc(users, func(a, b User) int {
return cmp.Compare(a.Age, b.Age)
})
fmt.Println(users)
}O que isso demonstra:
slices.Sort requer elementos ordenados; SortFunc aceita comparadores customizados que retornam o sinal cmp.maps.Clone e maps.Equal evitam cópia/igualdade feitas manualmente.cmp.Compare nos campos, não == nas structs, a menos que sejam totalmente comparáveis e essa seja a ordem pretendida.slices modificam as slices no local, a menos que o nome diga Clone ou retorne uma nova slice.maps não copiam valores profundamente; ponteiros e slices dentro dos valores são alias como atribuição de mapa comum.cmp.Compare retorna -1, 0 ou 1 para tipos ordenados e é o tipo de retorno preferido do comparador para slices.SortFunc.slices| Função | Propósito |
|---|---|
Sort, SortFunc | Ordenação no local |
BinarySearch, BinarySearchFunc | Busca em slice ordenada |
Contains, Index | Busca linear |
Clone, Compact, Delete | Operações de memória de slice |
Insert, Replace | Edições estruturais |
maps| Função | Propósito |
|---|---|
Clone | Cópia superficial do mapa |
Copy | Mesclar no destino |
Equal | Igualdade profunda de chaves e valores |
DeleteFunc | Remover por predicado |
cmp| Símbolo | Propósito |
|---|---|
cmp.Ordered | Restrição para built-ins ordenados e tipos subjacentes |
cmp.Compare(x, y) | Comparação de três vias para tipos ordenados |
cmp.Or(x, y, …) | Escolher o primeiro resultado de comparação não zero nas chaves de ordenação |
// Ordenação de múltiplas chaves com cmp.Or
slices.SortFunc(records, func(a, b Record) int {
return cmp.Or(
cmp.Compare(a.Region, b.Region),
cmp.Compare(a.Name, b.Name),
)
})slices.SortFunc em vez de sort.Slice para código novo - assinaturas de comparador mais claras.slices.SortStableFunc se encaixa na sua versão do Go e use-a quando elementos iguais devem manter a ordem de entrada.Map ainda são úteis: func Map[T, U any](in []T, f func(T) U) []U.== em structs - Use SortFunc com ordem explícita de campos. Correção: cmp.Or nos campos.maps.Clone copia profundamente - Valores são alias. Correção: clone estruturas aninhadas explicitamente quando necessário.cmp.Ordered.maps.Copy - Pânico ao escrever em mapa nil. Correção: dst = make(map[K]V) antes da cópia.| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
Pacote sort | Código legado, tipos não-slice | Código novo apenas para slices |
| Loops escritos manualmente | Pequena operação única em caminho crítico já inlined | Algoritmo repetido entre tipos |
x/exp/slices experimentos | Recursos de ponta | Produção sem validação |
| Estrutura de dados/índice específica do domínio | Estatísticas de ordem além da ordenação de slices | Lotes simples em memória |
Sempre para manutenção de produção - a biblioteca padrão acompanha os lançamentos e otimizações do Go.
Genéricos customizados para linhas únicas raramente compensam.
Sort precisa de elementos cmp.Ordered.
SortFunc aceita qualquer tipo de elemento com uma função comparadora.
Sim - novo array de suporte.
Use quando precisar se desvincular da memória do chamador.
Dois mapas nil são iguais.
Mapa nil vs mapa não nil vazio não são iguais.
Retorna a primeira comparação não zero em uma cadeia.
Ideal para ordenações lexicográficas de múltiplos campos.
byte é ordenado.
Sort funciona; lembre-se que o pacote bytes também tem helpers especializados.
O suporte varia por versão e placa.
Verifique em CI para alvos embarcados.
Um Map simples de []T para []U tem poucas linhas.
Filter retorna uma slice recortada ou anexa a um buffer pré-alocado.
Ele encontra qualquer índice correspondente em dados ordenados.
Percorra os vizinhos se precisar de todos os elementos iguais.
Sim para listas de cabeçalhos, métodos permitidos e ordenação de segmentos de caminho em testes.
Mantenha as assinaturas de handler não genéricas.
Corpos monomorfizados pequenos frequentemente são inlined como código escrito manualmente.
Faça benchmark se tiver dúvidas.
slices.SortFunc com comparadores cmp.Compare ou cmp.Or.
slices.Containscmp.Orderedmaps.Equal vs ==Versões da Pilha: Esta página foi escrita para Go 1.26.x (GC padrão Green Tea, go fix modernizers - verifique o patch na compilação), chi (última - verifique na compilação), gin (última - verifique na compilação), echo (última - verifique na compilação), google.golang.org/grpc (última - verifique na compilação), sigs.k8s.io/controller-runtime (última - verifique na compilação), kubebuilder (última - verifique na compilação), tinygo (última - verifique os alvos da placa na compilação), wazero (última - verifique na compilação) e golangci-lint (última - verifique o conjunto de linters na compilação).
Revisado por Chris St. John·Última atualização: 18 de jul. de 2026