golangci-lint: Agregador de linters para Go
1. ¿Qué es y para qué sirve?
golangci-lint es un potente agregador de linters para el lenguaje Go que unifica decenas de herramientas populares de análisis estático de código en una única interfaz rápida y configurable. En lugar de instalar y ejecutar cada linter por separado (por ejemplo, vet, staticcheck, errcheck, gocyclo y muchos otros), el desarrollador obtiene un solo comando que los ejecuta todos en paralelo, almacena en caché los resultados y genera un informe unificado. Esto ahorra horas de configuración en CI/CD y en el desarrollo local.
¿Para qué sirve? En proyectos grandes de Go (microservicios, utilidades CLI, servidores web) es imposible mantener la calidad del código manualmente. Errores como no manejar correctamente los errores, variables sin usar, un formato incorrecto o posibles deadlocks pueden provocar fallos en producción. golangci-lint encuentra automáticamente estos problemas durante la revisión de código o en un hook pre-commit. También ayuda a mantener un estilo de código uniforme en el equipo, algo fundamental para la legibilidad y el mantenimiento.
Ventajas clave frente a ejecutar linters por separado: velocidad (los linters se ejecutan en paralelo y los resultados se almacenan en caché), flexibilidad (puedes activar o desactivar cualquier linter y configurar sus reglas mediante un archivo YAML), integración (funciona con IDEs, sistemas CI/CD y soporta go vet de serie) y formato de salida unificado (JSON, SARIF, texto con colores, para cualquier herramienta).
2. Instalación
La instalación de golangci-lint se puede realizar de varias maneras. La forma recomendada es mediante go install (requiere Go 1.18+):
go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest
Tras la instalación, el binario estará disponible en $GOPATH/bin (normalmente ~/go/bin). Verifica la instalación:
golangci-lint --version
Métodos alternativos (para CI/CD o si no tienes Go instalado):
- Linux/macOS (curl):
curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.55.2 - macOS (Homebrew):
brew install golangci-lint - Docker:
docker run --rm -v $(pwd):/app -w /app golangci/golangci-lint:v1.55.2 golangci-lint run -v
3. Inicio rápido — ejemplo mínimo funcional
Crea un módulo Go simple y un archivo con un error intencionado:
mkdir miproyecto && cd miproyecto
go mod init miproyecto
Crea el archivo main.go:
package main
import "fmt"
func main() {
x := 10
fmt.Println("Hola")
// Error: variable x sin usar
}
Ejecuta el linter:
golangci-lint run
La salida será similar a esta:
main.go:6:2: `x` is unused (deadcode)
x := 10
^
El linter ha encontrado una variable sin usar. Corrige el código (elimina la línea x := 10) y ejecútalo de nuevo; no debería haber errores.
Para una verificación más estricta, usa las banderas -v (verbose) y --fast (solo linters rápidos):
golangci-lint run -v --fast
4. Comandos y opciones principales
A diferencia de una biblioteca, golangci-lint es una herramienta CLI. Sus "métodos" son comandos y banderas. Veamos 8 comandos y opciones clave.
4.1. run — ejecución principal de linters
Firma: golangci-lint run [banderas] [ruta]
Qué hace:
También en la biblioteca
Kotlinx.serialization y Valiktor: validación de datos en Kotlin
ts-mockito para TypeScript: guía completa con ejemplos
Trabajo con fechas en Kotlin: revisión de bibliotecas y herramientas
Trabajo con CSV en Rust: biblioteca csv y procesamiento de datos
Swift CLI con ArgumentParser: creación de potentes herramientas de consola