Boas Práticas de Genéricos
Nomenclatura, design de constraints e adoção gradual em bases de código.
Busque em todas as páginas da documentação
Nomenclatura, design de constraints e adoção gradual em bases de código.
Estas regras mantêm o código genérico legível em revisões, estável para os chamadores e alinhado com os padrões da biblioteca padrão.
type NodeID interface { ~int64 } é melhor do que repetir listas de uniões.cmp.Ordered e comparable em vez de uniões copiadas. Mantenha o alinhamento com a semântica da biblioteca padrão.~T quando tipos nomeados devem corresponder. Wrappers no estilo Celsius/Fahrenheit pertencem ao conjunto de tipos.T, K, V) ou nomes de domínio (ID, E) para parâmetros de tipo. Evite abreviações fofas de várias letras em APIs públicas.internal/, manipuladores simples fora. Corresponde ao layout de serviço chi / gin / echo.slices, maps e cmp antes de cópias personalizadas. Mantenha menos, ganhe atualizações em tempo de execução.maps.Clone referencia valores de ponteiro.comparable para conjuntos e deduplicação baseados em mapa. Não finja chaves de slice.int, string, struct). Uma função de teste por comportamento, vários argumentos de tipo.go test -race em contêineres genéricos usados a partir de goroutines. Regras de mutex inalteradas.Example* em vez de longas descrições em comentários. O compilador verifica os exemplos.Mais de dois ou três em um símbolo exportado merece escrutínio.
Componha tipos helpers em vez disso.
Subtestes com múltiplas instanciações são aceitáveis.
Não genericize wrappers de testify/assert sem valor.
Significado da constraint, linha de exemplo de instanciação e nota de desempenho se não for óbvia.
Mantenha os tipos de API gerados concretos.
Use genéricos apenas em pacotes utilitários escritos manualmente.
Quando a biblioteca padrão adicionar uma função equivalente ou apenas uma instanciação permanecer.
Código concreto mais simples vence.
Aliases não criam novas definições genéricas.
Defina tipos genéricos em tipos nomeados de struct/map.
Raramente em cadeias exportadas.
Helpers de chave de metadados internos podem usar genéricos com chaves comparable.
Trate como quebras de API - pesquise no repositório por instanciações e execute a matriz de compilação completa do CI.
Os analisadores staticcheck e unused do golangci-lint capturam instanciações mortas.
Combine com o job CI compile-all-variants para bibliotecas.
Sim, se os exports permanecerem pequenos e as constraints forem nomeadas.
Pacotes públicos excessivamente genéricos prejudicam o onboarding - siga a seção B.
Versões de Stack: Esta página foi escrita para Go 1.26.x (padrão Green Tea GC, go fix modernizers - verifique o patch na compilação), chi (última versão - verifique na compilação), gin (última versão - verifique na compilação), echo (última versão - verifique na compilação), google.golang.org/grpc (última versão - verifique na compilação), sigs.k8s.io/controller-runtime (última versão - verifique na compilação), kubebuilder (última versão - verifique na compilação), tinygo (última versão - verifique os alvos de placa na compilação), wazero (última versão - verifique na compilação) e golangci-lint (última versão - verifique o conjunto de linters na compilação).
Revisado por Chris St. John·Última atualização: 19 de jul. de 2026