Boas Práticas Fundamentais de Go
Hábitos essenciais que todo desenvolvedor Go deve internalizar primeiro.
Busque em todas as páginas da documentação
Hábitos essenciais que todo desenvolvedor Go deve internalizar primeiro.
Estas regras reforçam os fundamentos da seção: nomes claros, tratamento explícito de erros nas fronteiras e coleções usadas com suas semânticas reais.
gofmt, go vet e golangci-lint para capturar violações automaticamente.i e err são aceitáveis em loops; APIs exportadas merecem nomes descritivos.:= dentro de funções quando o tipo for óbvio. Reserve var para declarações em nível de pacote e valores zero intencionais.iota. Evite números mágicos espalhados na lógica; nomeie estados e flags explicitamente.make ou literais antes de escrever. Nunca atribua a um mapa nil.len(string) como comprimento de byte, não contagem de caracteres. Use range ou utf8.RuneCountInString para texto visível ao usuário.make([]T, 0, n) reduz as alocações em loops críticos.append. s = append(s, x) porque append pode retornar um novo cabeçalho.main enxuto; coloque a lógica em pacotes importáveis. Um módulo pode hospedar pontos de entrada cmd/ e código de biblioteca lado a lado.internal/ para código que não deve vazar entre módulos. Deixe o compilador impor limites em vez de apenas comentários.go fmt ./... antes de cada commit. Formatação consistente remove debates de estilo na revisão.go test ./... e go vet ./... em CI. Erros fundamentais devem falhar rapidamente na automação.go.mod e comite go.sum. Builds reproduzíveis começam com um grafo de módulos limpo.Não - structs pequenas são mais baratas por valor.
Use ponteiros para mutação, campos opcionais ou custo de cópia comprovado.
Constantes e variáveis somente leitura são aceitáveis.
Estado de pacote mutável requer sincronização e prejudica a testabilidade - evite, a menos que esteja encapsulando primitivas sync por design.
Raramente - tamanhos fixos de rede, blocos criptográficos ou restrições incorporadas.
Use slices como padrão para código de aplicação.
Incorpore quando o tipo externo expõe genuinamente o comportamento incorporado (Server registra via Logger incorporado).
Use campos nomeados quando a relação for "tem um", não "se comporta como".
append pode realocar e retornar um cabeçalho de slice diferente.
Ignorar o retorno deixa você apontando para capacidade ou dados obsoletos.
Retornos nomeados ajudam na documentação em funções pequenas; evite quando obscurecem a clareza.
Código fundamental deve favorecer return x, err explícito.
Passe variáveis de loop como parâmetros de função.
No Go 1.22+, variáveis por iteração reduzem o risco, mas parâmetros explícitos permanecem mais claros.
cmd/<app>/main.go contém executáveis; código de biblioteca vive em pacotes importáveis na raiz do módulo ou pkg/ por convenção da equipe.
Slices nil geralmente codificam como null; slices vazios como [].
Escolha intencionalmente para contratos de API e documente a escolha.
Sempre que o código não puder ser importado por outros módulos - auxiliares vinculados a um produto, não um SDK público.
Apenas quando validação ou invariantes são necessários.
Prefira valores zero úteis para structs de configuração simples.
Ative linters como govet, staticcheck e errcheck para impor muitos desses hábitos automaticamente em CI.
makeVersõ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