Un framework web en Go es una capa que facilita rutas, middlewares y utilidades habituales para construir APIs con menos código repetido. Muchos se apoyan en net/http, aunque no todos.
Go ya trae un servidor HTTP muy capaz en la librería estándar. Eso es importante. Antes de instalar nada, conviene tener claro que net/http no es un juguete.
Desde Go 1.22, net/http ya incluye patrones por método y parámetros de ruta. Aun así, cuando una API crece aparecen necesidades como grupos, validación, binding, middlewares empaquetados o respuestas más cómodas. Ahí un framework puede ahorrar trabajo.
¿Necesito un framework?
Depende del tamaño del proyecto. Para una herramienta interna pequeña, un webhook o una API sencilla, net/http suele ser suficiente.
Para una API con muchas rutas, autenticación, validación y convenciones compartidas, un framework puede hacer que el código quede más uniforme y menos repetitivo.
En Go se valora mucho mantener las dependencias bajo control. No se trata de evitar frameworks por orgullo, sino de usarlos cuando realmente aportan.
Gin
Gin es un framework extendido con una API centrada en productividad, binding, renderizado y middlewares. Su versión actual requiere Go 1.25 o posterior.
go get github.com/gin-gonic/gin@latestEjemplo mínimo:
package main
import (
"log"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"mensaje": "pong",
})
})
log.Fatal(r.Run(":8080"))
}Gin destaca por su ergonomía. El contexto gin.Context agrupa request, response, parámetros, JSON y utilidades.
r.GET("/usuarios/:id", func(c *gin.Context) {
id := c.Param("id")
c.JSON(200, gin.H{"id": id})
})Fiber
Fiber está inspirado en Express de Node.js y usa fasthttp por debajo, no net/http. Fiber v3 es la rama actual y requiere Go 1.25 o posterior.
go get github.com/gofiber/fiber/v3@latestEjemplo:
package main
import (
"log"
"github.com/gofiber/fiber/v3"
)
func main() {
app := fiber.New()
app.Get("/ping", func(c fiber.Ctx) error {
return c.JSON(fiber.Map{
"mensaje": "pong",
})
})
log.Fatal(app.Listen(":8080"))
}Fiber resulta muy cómodo si venís de JavaScript, porque la forma de trabajar recuerda bastante a Express.
Como Fiber no usa net/http directamente, algunas librerías o middlewares del ecosistema estándar no encajan sin adaptadores. No es malo, simplemente conviene saberlo antes de elegir.
chi
chi es un router ligero y muy idiomático. Se apoya en net/http, así que encaja muy bien con la librería estándar.
go get github.com/go-chi/chi/v5@latestEjemplo:
package main
import (
"log"
"net/http"
"github.com/go-chi/chi/v5"
)
func main() {
r := chi.NewRouter()
r.Get("/ping", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("pong"))
})
log.Fatal(http.ListenAndServe(":8080", r))
}chi suele gustar mucho cuando queréis algo pequeño, compatible con net/http y sin demasiada capa extra.
Comparativa rápida
| Opción | Enfoque | Cuándo encaja |
|---|---|---|
net/http | Biblioteca estándar con métodos y comodines | Servicios que no necesitan una capa adicional |
| Gin | Framework con contexto, binding y renderizado | APIs que valoran convenciones y utilidades integradas |
| Fiber v3 | API estilo Express sobre fasthttp | Equipos que aceptan salir del ecosistema directo de net/http |
| chi v5 | Router ligero sobre net/http | Proyectos que necesitan grupos y composición manteniendo compatibilidad estándar |
Qué elegir
Si estáis aprendiendo Go, mi recomendación es clara: empezad con net/http. Así entendéis la base real del ecosistema.
Después, cuando el proyecto pida grupos, binding o middlewares empaquetados, probad chi o Gin. Fiber v3 puede encajar si su estilo os resulta natural y la compatibilidad directa con net/http no es un requisito.
No elijáis un framework solo porque salga en una comparativa de rendimiento. En APIs reales, muchas veces el cuello de botella está en la base de datos, la red o servicios externos, no en el router.