Melhores Práticas para Depuração e Cenários de Defeitos
Checklists de prevenção e modelos de RCA para incidentes em Go.
Busque em todas as páginas da documentação
Checklists de prevenção e modelos de RCA para incidentes em Go.
Estas regras transformam arestas cortantes recorrentes em hábitos de revisão, portões de CI e notas pós-incidente que impedem que a mesma classe de defeito seja enviada duas vezes.
go test -race, govet e golangci-lint em pacotes que compartilham estado mutável.GOTRACEBACK=all e endpoints pprof aceleram a causa raiz.-race e paralelismo realista. Passes locais instáveis escondem data races que a carga de produção expõe.(nil, nil) para "não encontrado" em tipos ponteiro. Retorne ErrNotFound ou um sentinel tipado que os chamadores tratam com errors.Is.err == nil não garante *T não nulo.error. Retorne um erro nil não tipado ou um valor de erro concreto, não (*MyError)(nil), a menos que os chamadores esperem isso.null desserializa para nil sem erro.nilaway, staticcheck) em limites de serviço. Capture caminhos de retorno que os analisadores sinalizam antes do pânico em tempo de execução.s[low:high:high] ou append([]T(nil), s...) quando os consumidores puderem adicionar.sync.Map ou locks de shard para caches.bytes.Buffer.Bytes() como efêmeras. Copie se reter além da próxima mutação do buffer.-race quando slices ou structs são mutados a partir de manipuladores e loops de atualização em segundo plano.r.Context() através de manipuladores HTTP para todas as I/Os bloqueantes. Desconexão do cliente e Shutdown devem parar o trabalho.cancel() de WithCancel/WithTimeout. Use defer cancel() imediatamente após a criação.select em ctx.Done() para goroutines bloqueadas em canais. Evite vazamentos quando os produtores nunca enviam.v := v ou passagem de parâmetro continua defensiva após Go 1.22.defer dentro de loops sem uma função por iteração. Defers se empilham até a saída da função e vazam descritores de arquivo.sync.Once para singletons preguiçosos, não inicialização de dupla verificação não sincronizada. O detector de race valida caminhos Once de forma barata.ParseInLocation. Layouts sem zona usam UTC, não a zona do laptop do desenvolvedor.In(loc) para exibição. Compare com Equal, não com strings formatadas.time/tzdata ou instale tzdata em contêineres mínimos. LoadLocation falha silenciosamente em CI se nunca for chamado.http.Server.Shutdown. Cancele o contexto raiz quando o sinal chegar.Propagação de contexto, nenhum mapa mutável compartilhado sem locks, retornos de erro explícitos em vez de (nil, nil), e -race em CI em pacotes de manipuladores.
Use A para incidentes, B-D para alterações concorrentes ou de parser, E para alterações de API e de implantação.
Passagem completa mensal em pacotes quentes.
Cada letra mapeia para artigos nesta seção.
Use a lista para prevenção; use walkthroughs ao ensinar passos de reprodução.
Família de sintomas, linha do tempo, evidência de goroutine/pânico, frame de causa raiz, PR de correção e guarda (teste, lint ou monitor) provando que a recorrência é detectada.
Bugs de lógica de goroutine única e pequenos programas de reprodução.
Mova para Delve e pprof quando concorrência, vazamentos ou semântica de interface nil aparecerem.
Regras centrais de nil, slice e race se aplicam.
Algumas stdlib (tzdata, partes de reflection) diferem - verifique os alvos da placa por pinos de manifesto.
Trimestralmente em staging: carga, pare o tráfego, confirme que a contagem de goroutines retorna à linha de base em minutos.
Não - linters pegam padrões que os revisores perdem.
A revisão pega semânticas erradas que os linters não conseguem modelar.
Execute go test -race -count=50 no pacote instável.
A maioria da instabilidade em serviços Go são races ou suposições de tempo.
Sim para pacotes que mutam estado compartilhado ou geram goroutines em manipuladores.
Pacotes puros podem ser excluídos explicitamente na configuração de CI.
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 da 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