Aplicación de gofmt y goimports
gofmt y goimports son la capa de formato que todo repositorio Go debería automatizar.
Busca en todas las páginas de la documentación
gofmt y goimports son la capa de formato que todo repositorio Go debería automatizar.
Los equipos los aplican en editores, ganchos pre-commit y CI para que las revisiones se centren en el comportamiento en lugar del espacio en blanco.
Tarjeta de receta de referencia rápida - lista para copiar y pegar.
# Formatea todos los paquetes en su lugar
gofmt -w .
goimports -local example.com/mycorp -w .
# CI: falla si algún archivo cambiara
test -z "$(gofmt -l .)"
test -z "$(goimports -local example.com/mycorp -l .)"
# Optimizaciones opcionales
gofmt -s -w .Cuándo usar esto:
Diseño del repositorio:
example.com/widget/
go.mod # module example.com/mycorp/widget
cmd/api/main.go
internal/store/store.gocmd/api/main.go antes de la aplicación:
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)
}Aplicar:
goimports -local example.com/mycorp -w ./cmd ./internal
gofmt -s -w ./cmd ./internalDespués (la agrupación de importaciones muestra el efecto 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)
}Extracto de GitHub Actions:
- name: Format check
run: |
test -z "$(gofmt -l .)"
test -z "$(goimports -local example.com/mycorp -l .)"Lo que esto demuestra:
-local mantiene los módulos internos en un grupo de importación separado..editorconfig para el ancho de tabulación.formatting.gofumpt o goimports.| Grupo | Rutas de ejemplo | Separador |
|---|---|---|
| Biblioteca estándar | fmt, net/http | línea en blanco debajo |
| Terceros | github.com/go-chi/chi/v5 | línea en blanco debajo |
Local (prefijo -local) | example.com/mycorp/widget/internal/store | final del bloque |
| Modo | Comando | Mejor para |
|---|---|---|
| Solo comprobar | gofmt -l . | Puertas de CI |
| Corregir localmente | gofmt -w . | pre-commit |
| Corregir en bot de CI | trabajo de auto-commit | OSS de alta rotación |
| Editor al guardar | gopls formatting | edición diaria |
# Verifica que las versiones de las herramientas coincidan con la CI
gofmt -V # incluido con la versión de Go
go version -m $(which goimports) | head -1Fija la pseudo-versión de golang.org/x/tools en tools.go para una instalación reproducible de goimports en portátiles y agentes.
| Bandera | Herramienta | Efecto |
|---|---|---|
-w | ambos | Escribe el archivo formateado |
-l | ambos | Lista los archivos que cambiarían |
-s | gofmt | Aplica simplificaciones |
-local | goimports | Prefijos para el grupo de importación local |
-local en CI - Las importaciones internas se mezclan con las rutas de terceros. Solución: Pasa los mismos prefijos -local en la documentación, ganchos y flujos de trabajo.*.pb.go de las rutas de gofmt -l o ejecuta el formato como parte de la generación de código.tools.go y go install en CI.make fmt).go fmt como comprobación - go fmt siempre reescribe archivos; no es un patrón de CI solo de listado. Solución: Usa gofmt -l o un trabajo de lint dedicado.| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| gofumpt | Reglas de espaciado más estrictas que gofmt | Librerías OSS donde los colaboradores esperan el gofmt estándar |
Linter gofmt de golangci-lint | Ya se está ejecutando golangci-lint para todo | Repositorios pequeños que solo quieren cero YAML |
| Solo revisión manual | Nunca para producción Go | - |
Archivos de configuración estilo cargo fmt | - | El ecosistema Go no soporta este modelo |
Elige una comprobación principal.
La mayoría de los equipos ejecutan goimports (que incluye gofmt) localmente y verifican con goimports -l en CI.
Simplificaciones como s[a:len(s)] a s[a:].
Opcional pero común en ganchos; documenta si tu CI requiere -s.
Usa git diff --name-only --cached '*.go' | xargs goimports -w para limitar el alcance y mantener los ganchos rápidos.
Configurable a través de la configuración del editor.
Alinea gopls con la CI para que el guardado al instante coincida con las expectativas del pipeline.
Generalmente no - vendor es código fuente de terceros copiado textualmente.
Excluye las rutas de vendor de las comprobaciones de formato.
Fuera del alcance de gofmt.
Usa Prettier o formateadores específicos del lenguaje para YAML, Markdown y fuentes .proto de protobuf.
gofmt preserva las etiquetas de compilación en la parte superior del archivo.
Ejecuta formateadores en archivos etiquetados con las mismas etiquetas que usa la CI al analizar.
Repite la bandera: goimports -local example.com/a -local example.com/b -w ..
Proporciona make fmt y un bot opcional de auto-corrección.
La consistencia reduce la fricción a largo plazo más que los commits de formato únicos.
La salida generada debe ser formateada por el generador o un paso posterior.
No formatees manualmente los archivos generados que regen sobrescribe.
Versiones de Stack: Esta página fue escrita para Go 1.26.x (GC por defecto Green Tea, modernizadores go fix - verifica el parche en la compilación), chi (última versión - verifica en la compilación), gin (última versión - verifica en la compilación), echo (última versión - verifica en la compilación), google.golang.org/grpc (última versión - verifica en la compilación), sigs.k8s.io/controller-runtime (última versión - verifica en la compilación), kubebuilder (última versión - verifica en la compilación), tinygo (última versión - verifica los objetivos de placa en la compilación), wazero (última versión - verifica en la compilación) y golangci-lint (última versión - verifica el conjunto de linters en la compilación).
Revisado por Chris St. John·Última actualización: 16 jul 2026