Checklist de Refatoração e Auditoria de Arquitetura
Sinais de alerta em acoplamento de pacotes, globais e abuso de init().
Busque em todas as páginas da documentação
Sinais de alerta em acoplamento de pacotes, globais e abuso de init().
Percorra este checklist antes de um lançamento importante, após picos de onboarding ou quando os tempos de compilação e as taxas de incidentes aumentam juntos.
Estado mutável global para banco de dados, configuração ou clientes: Substitua por injeção de construtor a partir de main.
var db *sql.DB usado entre pacotesNewService(repo Repository) configurado uma vez na inicializaçãoCiclos de importação entre pacotes de produção: Extraia contratos compartilhados ou inverta a direção da dependência.
handler importa service importa handlerinternal/contractsinit() executa I/O ou entra em pânico por má configuração: Falhe em main com erros claros em vez disso.
init()cfg, err := Load(); if err != nil { log.Fatal(err) }Regras de negócios apenas em handlers HTTP: Mova validação e fluxos de trabalho para serviços com testes unitários.
ServeHTTP de 200 linhas com SQLRegister(ctx, email) testado sem httptestSegredos ou endpoints codificados em pacotes de biblioteca: Carregue de env/flags apenas na raiz de composição.
const apiURL = "https://prod..."Config.APIURL validado na inicializaçãoutil, common, helpers): Divida por capacidade (internal/timeutil, internal/validate).net/http, gin ou código gerado por gRPC: Mova adaptadores para internal/adapter/*.internal/ para congelar a superfície da API.cmd/ duplicando configuração de forma divergente: Extraia helpers Provide* compartilhados ou conjunto Wire.context.Context em funções de I/O: Adicione ctx como primeiro parâmetro; canalize a partir dos handlers.var ErrNotFound = errors.New(...) e errors.Is._) sem comentário explicando o efeito colateral: Documente o propósito de registro ou remova.models, controllers) com importações cruzadas: Reorganize por fatia de funcionalidade.replace commitadas para caminhos de laptop locais: Use go.work localmente; mantenha go.mod portátil.slog ou logger da equipe nas bordas.http.Server e MaxBytesReader.go generate, sqlc ou buf em CI.Uma a duas horas para um módulo médio com go mod graph e revisão de importações de pacotes.
Análises mais profundas exigem proprietários por funcionalidade.
go mod graph, golangci-lint (depguard, forbidigo), verificações personalizadas de ciclo de importação go:generate e go vet ./....
Não.
Corrija os itens Críticos, depois estruture os itens Altos em tickets de funcionalidade - reescritas "big-bang" raramente são enviadas.
Nenhuma contagem de linhas fixa - se três equipes o editam semanalmente e as importações se espalham, divida independentemente do número de linhas de código (LOC).
grep -R "func init()" internal/ cmd/ e classifique cada um como apenas registro vs I/O.
Proíba inits de I/O em regras de lint.
Pequenos helpers estáveis sem significado de negócios e com um único time proprietário.
Renomeie para um propósito específico quando crescer.
Os itens 1-12 devem estar verdes antes da extração de RPC - caso contrário, você distribuirá espaguete.
Captura de tela do gráfico de importação, IDs de incidentes, tendência de tempo de compilação, taxa de falha de testes.
Sim, com um patrocinador sênior - ótimo exercício de onboarding lendo importações de pacotes.
Após hacks rápidos - adicione uma regra de lint depguard bloqueando var .* \*sql.DB fora de cmd/.
Versões de Stack: 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 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: 18 de jul. de 2026