Mejores Prácticas para Frameworks Web
Un resumen condensado de las 25 prácticas más importantes para frameworks web extraídas de cada página de esta sección.
Busca en todas las páginas de la documentación
Un resumen condensado de las 25 prácticas más importantes para frameworks web extraídas de cada página de esta sección.
Mantén los manejadores (handlers) delgados: Decodifica la entrada del transporte, llama a los servicios, mapea errores a HTTP; las reglas de negocio viven fuera de los tipos de contexto del framework.
Prefiere http.Handler en el núcleo: Escribe manejadores portátiles siempre que sea posible para que chi, mux y los adaptadores de frameworks sigan siendo intercambiables.
Elige routers antes que frameworks: Utiliza stdlib o chi hasta que el volumen de enlace JSON justifique el bloqueo con Gin o Echo.
Configura los tiempos de espera de http.Server: El middleware del router no sustituye a ReadHeaderTimeout, ReadTimeout y WriteTimeout en el servidor.
Registra el middleware de recuperación: La recuperación de pánicos pertenece a la pila de middleware externa en cada listener público.
Ordena el middleware deliberadamente: Registro y trazado en el exterior, autenticación a continuación, tiempo de espera y límites de cuerpo antes de los manejadores que puedan bloquear.
Usa grupos de rutas para versiones de API: Prefija /api/v1 con middleware a nivel de grupo en lugar de repetir rutas por manejador.
Analiza los parámetros de ruta de forma segura: Los parámetros de URL son cadenas; valida con strconv o enlace antes de las búsquedas de dominio.
Prefiere ShouldBind* en Gin: Evita BindJSON cuando necesites JSON de error personalizado; ShouldBindJSON no escribe respuestas automáticamente.
Conecta los validadores explícitamente en Echo: Establece e.Validator antes de depender de c.Validate; la validación no es automática de fábrica.
Devuelve errores centralmente en Echo: Usa las devoluciones de error del manejador y un HTTPErrorHandler personalizado en lugar de dispersar escrituras de estado.
Establece el modo de lanzamiento de Gin en producción: Usa gin.New() con el middleware elegido y gin.SetMode(gin.ReleaseMode) para evitar la sobrecarga de depuración.
Limita los cuerpos de las solicitudes: Aplica http.MaxBytesReader o equivalentes del framework antes de decodificar cargas JSON grandes.
Propaga r.Context(): Pasa el contexto de la solicitud a las llamadas de base de datos y RPC para cancelación y plazos.
Usa claves de contexto tipadas: Evita claves de contexto de cadena para valores con ámbito de solicitud; usa tipos personalizados no exportados para evitar colisiones.
Documenta el comportamiento del host y del proxy: Al usar coincidores de host de mux o enrutamiento de subdominios, normaliza Host/X-Forwarded-Host detrás de los balanceadores de carga.
Monta migraciones con prefijos: Ejecuta routers antiguos y nuevos uno al lado del otro (/v1, /v2) hasta que las métricas muestren un corte limpio.
Evita el middleware doble: Al montar routers, aplica el registro y la autenticación una vez en el manejador más externo.
Prueba manejadores portátiles con httptest: Ejercita http.HandlerFunc directamente sin iniciar motores de framework para pruebas unitarias.
Mapea errores de validación para clientes: Traduce los fallos del validador en JSON con ámbito de campo en lugar de cadenas err.Error() crudas.
Usa structs DTO en el borde: Mantén los structs de transporte separados de los modelos de dominio para evitar que las etiquetas JSON se filtren hacia adentro.
Elige mux solo para coincidores: Elige gorilla/mux cuando se requieran reglas de host/regex/encabezado, no para conveniencia CRUD ordinaria.
Autentica las actualizaciones de WebSocket temprano: Valida las credenciales durante la solicitud de actualización antes de cambiar de protocolo.
Registra la elección del framework en los ADR: Documenta el escenario, las alternativas clasificadas y los adaptadores de migración al estandarizar una biblioteca.
Mantén la observabilidad con forma de stdlib: Prefiere el middleware OTel de http.Handler o los adaptadores de contribución de framework verificados para trazas consistentes.
No; stdlib más chi cubren muchas APIs de producción; los frameworks principalmente reducen la ceremonia de JSON y enrutamiento.
Manejadores delgados que llaman a servicios Go planos; mejora las pruebas y facilita la migración del router.
Lista de verificación: tiempos de espera del servidor, middleware de recuperación, propagación de contexto y sin lógica de negocio en gin.Context más allá del enlace.
Al agregar WebSockets, hosts multi-inquilino o generación de código OpenAPI; los requisitos pueden superar la elección original.
Las APIs públicas necesitan un mapeo de errores más estricto, límites de cuerpo y disciplina de terminación TLS; las APIs internas aún necesitan tiempos de espera y cancelación de contexto.
Los frameworks se asientan sobre net/http; la configuración del servidor, la agrupación de clientes y los conceptos de middleware de net/http todavía se aplican.
Solo con contratos de observabilidad compartidos y directrices de manejadores portátiles; de lo contrario, estandariza en chi o en un framework completo.
Reescribir manejadores que funcionan a contextos de framework sin un plan de montaje de "strangler"; prefiere primero adaptadores y prefijos.
Tantas como puedas diagramar en una página; si el orden no está claro, consolida o documenta la pila estándar en main.
Mantén la codificación JSON en manejadores o pequeños ayudantes de respuesta; comparte tipos de esquema a través de paquetes DTO, no mapas gin.H globales.
Versiones de pila: Esta página fue escrita para Go 1.26.x (predeterminado GC Green Tea, go fix modernizers - verificar parche en la compilación), chi (última versión - verificar en la compilación), gin (última versión - verificar en la compilación), echo (última versión - verificar en la compilación), google.golang.org/grpc (última versión - verificar en la compilación), sigs.k8s.io/controller-runtime (última versión - verificar en la compilación), kubebuilder (última versión - verificar en la compilación), tinygo (última versión - verificar objetivos de placa en la compilación), wazero (última versión - verificar en la compilación) y golangci-lint (última versión - verificar conjunto de linters en la compilación).
Revisado por Chris St. John·Última actualización: 18 jul 2026