Patrones de Desarrollo Go
Flujo de Trabajo Obligatorio
Para revisiones, invocar skills relacionados: security-audit (OWASP), enterprise-readiness (OpenSSF/SLSA), github-project (protección de ramas). Todos son obligatorios.
Principios Fundamentales
Seguridad de Tipos
- Evitar:
interface{}(usarany),sync.Map, aserciones de tipo dispersas, reflexión - Preferir: Genéricos
[T any],errors.AsType[T](Go 1.26), tipos concretos - Ejecutar
go fix ./...después de actualizaciones
Consistencia
- Un patrón por dominio del problema
- Coincidir con los patrones del código base existente
- Refactorizar de manera integral o no hacerlo en absoluto
- Prioridad de configuración: valores predeterminados < archivo de configuración < variables de entorno < banderas
Pruebas
- Las etiquetas de compilación aíslan los niveles de pruebas: unitarias (predeterminado),
integration,e2e - Usar siempre
t.Parallel(),t.Helper(), subpruebas basadas en tablas - Usar
log/slogdirectamente: nunca envolverlo en interfaces Logger personalizadas
Convenciones
- Errores: minúsculas, sin puntuación (
errors.New("entrada inválida")) - Nomenclatura: ID, URL, HTTP (no Id, Url, Http)
- Envoltura de errores:
fmt.Errorf("fallo al procesar: %w", err)
Referencias
Hooks de Git: ls lefthook.yml 2>/dev/null && lefthook install || echo "Agregar lefthook; ver references/lefthook-template.md"
Cargar según sea necesario:
| Referencia | Propósito |
|---|---|
references/architecture.md | Estructura del paquete, gestión de configuración, cadenas de middleware |
references/logging.md | Registro estructurado con log/slog, migración desde logrus |
references/cron-scheduling.md | Patrones de go-cron: trabajos nombrados, actualizaciones en tiempo de ejecución, contexto, resiliencia |
references/resilience.md | Lógica de reintentos, apagado graceful, propagación de contexto |
references/docker.md | Patrones de cliente Docker, pooling de búferes |
references/ldap.md | Integración LDAP / Active Directory |
references/testing.md | Estrategias de prueba, etiquetas de compilación, pruebas basadas en tablas |
references/linting.md | golangci-lint v2, staticcheck, calidad de código |
references/api-design.md | Opciones de máscara de bits, opciones funcionales, builders |
references/fuzz-testing.md | Patrones de fuzzing en Go, semillas de seguridad |
references/contracts-and-invariants.md | Contratos, invariantes, pruebas de propiedades |
references/mutation-testing.md | Configuración de Gremlins, medición de calidad de pruebas |
references/makefile.md | Interfaz Makefile estándar para CI/CD |
references/modernization.md | Modernizadores Go 1.26, go fix, errors.AsType[T], wg.Go() |
references/lefthook-template.md | lefthook.yml listo para usar para hooks de Git de proyectos Go |
references/reusable-workflows.md | Llamadas reutilizables de flujos de trabajo de Actions, propagación de permisos, salidas de release-gate |
references/single-build-release.md | Lanzamiento de compilación única: compilar cruzadamente una vez, reutilizar para lanzamiento+contenedor |
references/awesome-go-submission.md | Envío a awesome-go: cuerpo del PR analizado por CI, formato de entrada, colisiones de nombres |
Compuertas de Calidad
Ejecutar antes de completar cualquier revisión:
golangci-lint run --timeout 5m # Linting
go vet ./... # Análisis estático
staticcheck ./... # Verificaciones adicionales
govulncheck ./... # Escaneo de vulnerabilidades
go test -race ./... # Detección de carreras
Correcciones de Vulnerabilidades en la Biblioteca Estándar
Cuando govulncheck reporte vulnerabilidades en la biblioteca estándar: verificar la versión de corrección a través de vuln.go.dev, actualizar go X.Y.Z en go.mod, ejecutar go mod tidy. Usar ramas de PR para repositorios con protección de ramas.
Contribuciones: Enviar mejoras a https://github.com/netresearch/go-development-skill