Boas Práticas para Funções, Métodos e Interfaces
Regras idiomáticas para projetar funções, métodos e interfaces que permanecem legíveis sob concorrência, testes e anos de atualizações de módulos.
Busque em todas as páginas da documentação
Regras idiomáticas para projetar funções, métodos e interfaces que permanecem legíveis sob concorrência, testes e anos de atualizações de módulos.
/v2.golangci-lint (ireturn, revive, govet) para que as convenções se tornem um sinal de CI.go fix em 1.26 podem mudar os idiomas.(T, error) com error por último. Corresponde às expectativas do leitor e às convenções do staticcheck.%w e prefixos de domínio. fmt.Errorf("checkout: charge: %w", err) preserva cadeias errors.Is.return explícitos são escaneados mais rapidamente na revisão.New(WithPort(8080)) escala sem quebrar os chamadores.context.Context primeiro nas fronteiras de I/O. Nunca armazene contexto em structs; passe-o através de parâmetros.*T quando métodos de ponteiro existem. Garante a satisfação da interface sem surpresas de endereço.sync.Mutex, sync.WaitGroup e campos semelhantes exigem apenas receptores de ponteiro.New ou New<Type>. Documente as dependências necessárias; valide as entradas antes de retornar.io superam interfaces Repository de nível empresarial.New retorna *Service, não ServiceInterface.(*T, error) ou interfaces nil não tipadas - nunca ponteiros nil tipados em interfaces.func(http.Handler) http.Handler permanece mais simples do que interfaces de um método quando nenhum mock é necessário.id := id ou passe parâmetros para go func(id int){...}(id).len==0, não identidade de slice nil. Chamadas com zero argumentos passam slices vazios não nil.go test -race em pacotes que usam goroutines com estado capturado. A filosofia sem detecção falha em produção.Comece com A e C para APIs públicas, depois B para tipos de domínio, e D ao adicionar concorrência.
A maioria dos bugs de produção rastreia interfaces e erros, não sintaxe variádica.
Em serviços com testes, sim - defina a interface ao lado do consumidor.
Ferramentas de binário único podem adiar até que uma segunda implementação ou mock apareça.
Mantenha os tipos do framework nas bordas.
Chame funções de domínio que retornam (T, error) e mapeie erros para status HTTP dentro dos manipuladores.
Raramente - quando o tipo concreto deve permanecer selado e a interface é o produto (plugins, fábricas de drivers).
Documente a política de evolução.
Sombreamento de err com := para que o defer não atualize o resultado nomeado.
Use atribuição no err externo ou evite resultados nomeados completamente.
Envolva clientes gerados por interfaces de um ou dois métodos por caso de uso.
Não espelhe interfaces de serviço gRPC inteiras no código de domínio.
ireturn pode sinalizar retornos de interfaces de funções - ajuste a severidade para corresponder à política de "retornar structs".
Consistência é mais importante do que habilitar todos os analisadores.
Use genéricos para algoritmos compartilhados; mantenha interfaces para substituição em tempo de execução e I/O.
Não recrie hierarquias de repositório genérico estilo Java.
Opções se destacam para ajuste opcional.
Configuração necessária e validada com muitos campos interdependentes se encaixa em uma struct verificada uma vez em New.
Reconciliadores gerados já usam receptores de ponteiro e clientes injetados.
Aplique a seção C ao abstrair SDKs de nuvem por meio de interfaces de domínio.
Closures e interfaces ainda se aplicam; evite capturar estado grande quando a memória é escassa.
Verifique chamadas de interface em alvos de hardware em tempo de compilação.
Durante grandes atualizações do Go e revisões trimestrais de API.
Adicione um teste de regressão falho quando um bug de nil tipado for lançado - vincule-o na wiki da equipe.
Versões de Stack: Esta página foi escrita para Go 1.26.x (padrão Green Tea GC, modernizadores go fix - verifique o patch na compilação), chi (mais recente - verifique na compilação), gin (mais recente - verifique na compilação), echo (mais recente - verifique na compilação), google.golang.org/grpc (mais recente - verifique na compilação), sigs.k8s.io/controller-runtime (mais recente - verifique na compilação), kubebuilder (mais recente - verifique na compilação), tinygo (mais recente - verifique os alvos de placa na compilação), wazero (mais recente - verifique na compilação) e golangci-lint (conjunto de linters mais recente - verifique na compilação).
Revisado por Chris St. John·Última atualização: 19 de jul. de 2026