Boas Práticas de Fluxo de Controle
Hábitos de fluxo de controle legíveis e quando refatorar a lógica aninhada.
Busque em todas as páginas da documentação
Hábitos de fluxo de controle legíveis e quando refatorar a lógica aninhada.
Essas regras mantêm o código Go plano, previsível e seguro em concorrência - desde a disciplina de if err != nil até os limites de pânico em servidores.
if aninhadas ou manipuladores com muitos loops chegarem a um PR.go vet, staticcheck e golangci-lint para capturar fluxos de controle suspeitos automaticamente.if estilo init. if err := f(); err != nil { return err } é melhor que caminhos de sucesso aninhados.switch para discriminação de múltiplos valores em uma expressão. Longas cadeias de else if na mesma variável sinalizam um switch.fallthrough a menos que você possa nomear o motivo em um comentário. Corpos de caso compartilhados devem chamar uma função auxiliar em vez disso.panic para falhas esperadas de requisição ou I/O. Retorne error e deixe os chamadores mapearem para status HTTP/gRPC.for range por padrão para slices, mapas, canais e strings. Use loops de índice quando precisar de vizinhos ou iteração reversa.s[i] = x atualiza a coleção; o valor do range é uma cópia.for range em canais causa deadlock quando ninguém fecha.break label ao sair de loops de busca aninhados. Substitua pirâmides booleanas found por um rótulo ou return auxiliar.break label para sair de loops for { select }. break simples apenas sai do select, não do loop.defer imediatamente após a aquisição bem-sucedida do recurso. Leitores associam Open/Lock com defer Close/Unlock visualmente.defer dentro de loops apertados sem uma função aninhada. Pilhas de defer crescem até que a função externa retorne.Recoverer do chi, Recovery do gin, Recover do echo, ou defer recover escrito à mão.return após escrever as respostas. Nunca chame next depois de ter finalizado a resposta.r.Context() para I/O downstream. Middleware de timeout só funciona quando os manipuladores respeitam o cancelamento.r.Body.Close() (ou equivalente) por requisição. Corpos vazados esgotam conexões sob carga.Raramente mais de dois níveis em código de aplicação.
Extraia funções ou use cláusulas de guarda quando mais profundo.
Quando um loop duplo apertado se beneficiaria de uma chamada extra e o rótulo nomeia claramente o destino de saída.
Se a lógica crescer além disso, extraia.
Sim para locks de escopo de função - defer mu.Unlock() após Lock() sobrevive a pânicos.
Para caminhos quentes dentro de loops, eleve o lock para fora.
switch { case cond: sem tag é a grafia moderna.
Mesma semântica, intenção mais clara.
Não - um middleware de recuperação envolvendo a árvore é suficiente.
Camadas duplicadas são redundantes, não prejudiciais.
Quando o corpo excede uma tela, precisa de múltiplas saídas ou se repete em testes.
Funções nomeadas melhoram rastros de pilha e testes unitários.
Quase nunca em código de aplicação.
Prefira rótulos, auxiliares ou tabelas de despacho orientadas a dados.
Excluir a chave atual durante a iteração é definido.
Mantenha a lógica de exclusão simples; extraia as chaves primeiro se tiver dúvidas.
Prefira erros para chamadores que podem reagir.
Reserve o pânico para uso indevido documentado que deve falhar em desenvolvimento.
staticcheck, govet, gosimple e revive sinalizam construções suspeitas.
Execute via golangci-lint em CI.
Versões de Stack: Esta página foi escrita para Go 1.26.x (Green Tea GC padrão, go fix modernizadores - 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