Enforcement de gofmt & goimports
gofmt e goimports são a camada de formatação que todo repositório Go deve automatizar.
Busque em todas as páginas da documentação
gofmt e goimports são a camada de formatação que todo repositório Go deve automatizar.
Equipes os impõem em editores, hooks de pre-commit e CI para que as revisões se concentrem no comportamento em vez de espaços em branco.
Cartão de receita de referência rápida - pronto para copiar e colar.
# Formata todos os pacotes no local
gofmt -w .
goimports -local example.com/mycorp -w .
# CI: falha se algum arquivo for alterado
test -z "$(gofmt -l .)"
test -z "$(goimports -local example.com/mycorp -l .)"
# Simplificações opcionais
gofmt -s -w .Quando usar isso:
Layout do repositório:
example.com/widget/
go.mod # module example.com/mycorp/widget
cmd/api/main.go
internal/store/store.gocmd/api/main.go antes do enforcement:
package main
import (
"fmt"
"example.com/mycorp/widget/internal/store"
"net/http"
)
func main() {
store := store.New()
http.HandleFunc("/ok", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, store.Ping())
})
http.ListenAndServe(":8080", nil)
}Imponha:
goimports -local example.com/mycorp -w ./cmd ./internal
gofmt -s -w ./cmd ./internalDepois (o agrupamento de imports mostra o efeito de -local):
package main
import (
"fmt"
"net/http"
"example.com/mycorp/widget/internal/store"
)
func main() {
store := store.New()
http.HandleFunc("/ok", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, store.Ping())
})
http.ListenAndServe(":8080", nil)
}Trecho do GitHub Actions:
- name: Format check
run: |
test -z "$(gofmt -l .)"
test -z "$(goimports -local example.com/mycorp -l .)"O que isso demonstra:
-local mantém módulos internos em um grupo de importação separado..editorconfig para largura de tabulação.formatting.gofumpt ou goimports estão habilitadas.| Grupo | Caminhos de exemplo | Separador |
|---|---|---|
| Biblioteca padrão | fmt, net/http | linha em branco abaixo |
| Terceiros | github.com/go-chi/chi/v5 | linha em branco abaixo |
Local (prefixo -local) | example.com/mycorp/widget/internal/store | fim do bloco |
| Modo | Comando | Melhor para |
|---|---|---|
| Apenas verificação | gofmt -l . | Portões de CI |
| Corrigir localmente | gofmt -w . | pre-commit |
| Corrigir em bot de CI | trabalho de auto-commit | OSS de alta rotatividade |
| Editor ao salvar | gopls formatting | edição diária |
# Verifica as versões das ferramentas para corresponder à CI
gofmt -V # empacotado com a versão do go
go version -m $(which goimports) | head -1Fixe a pseudo-versão golang.org/x/tools em tools.go para go install reproduzível de goimports entre laptops e agentes.
| Flag | Ferramenta | Efeito |
|---|---|---|
-w | ambos | Escreve o arquivo formatado |
-l | ambos | Lista os arquivos que seriam alterados |
-s | gofmt | Aplica simplificações |
-local | goimports | Prefixo para o grupo de importação local |
-local na CI - Imports internos se misturam com caminhos de terceiros. Correção: Passe os mesmos prefixos -local em docs, hooks e fluxos de trabalho.*.pb.go dos caminhos de gofmt -l ou execute o formato como parte da geração de código.tools.go e go install na CI.make fmt target).go fmt como verificação - go fmt sempre reescreve arquivos; não é um padrão de CI apenas de listagem. Correção: Use gofmt -l ou um job de linting dedicado.| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| gofumpt | Regras de espaçamento mais rigorosas que gofmt | Bibliotecas OSS onde contribuidores esperam gofmt padrão |
Linter gofmt do golangci-lint | Já executando golangci-lint para tudo | Repositórios minúsculos que querem zero YAML |
| Revisão manual apenas | Nunca para produção Go | - |
Arquivos de configuração estilo cargo fmt | - | O ecossistema Go não suporta este modelo |
Escolha uma verificação principal.
A maioria das equipes executa goimports (que inclui gofmt) localmente e verifica com goimports -l na CI.
Simplificações como s[a:len(s)] para s[a:].
Opcional, mas comum em hooks; documente se sua CI requer -s.
Use git diff --name-only --cached '*.go' | xargs goimports -w para limitar o escopo e manter os hooks rápidos.
Configurável via configurações do editor.
Alinhe gopls com a CI para que o salvar corresponda às expectativas do pipeline.
Geralmente não - vendor é código fonte de terceiros copiado literalmente.
Exclua caminhos de vendor de verificações de formato.
Fora do escopo para gofmt.
Use Prettier ou formatadores específicos da linguagem para YAML, Markdown e fontes .proto de protobuf.
gofmt preserva as build tags no topo do arquivo.
Execute formatadores em arquivos com tags usando as mesmas tags que a CI usa ao analisar.
Repita a flag: goimports -local example.com/a -local example.com/b -w ..
Forneça make fmt e um bot opcional de auto-correção.
Consistência reduz o atrito a longo prazo mais do que commits de formato únicos.
A saída gerada deve ser formatada pelo gerador ou por uma etapa posterior.
Não formate manualmente arquivos gerados que o regen sobrescreve.
Versões de Stack: Esta página foi escrita para Go 1.26.x (GC padrão Green Tea, modernizadores go fix - verifique o patch na compilação), chi (latest - verifique na compilação), gin (latest - verifique na compilação), echo (latest - verifique na compilação), google.golang.org/grpc (latest - verifique na compilação), sigs.k8s.io/controller-runtime (latest - verifique na compilação), kubebuilder (latest - verifique na compilação), tinygo (latest - verifique os alvos de placa na compilação), wazero (latest - verifique na compilação) e golangci-lint (latest - verifique o conjunto de linters na compilação).
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026