Fiber 的路由系统非常像快线城区的匝道牌。
先看几个基本例子:
app.Get("/health", func(c fiber.Ctx) error {
return c.SendString("ok")
})
app.Get("/users/:id", func(c fiber.Ctx) error {
id := c.Params("id")
return c.JSON(fiber.Map{"id": id})
})
app.Get("/files/*", func(c fiber.Ctx) error {
return c.SendString(c.Params("*"))
})
app.Get("/:name?", func(c fiber.Ctx) error {
name := c.Params("name")
if name == "" {
return c.SendString("no name")
}
return c.SendString("hello " + name)
})你可以把它们理解成:
/health:固定收费站/users/:id:带动态车牌识别的收费站/files/*:吃掉后面整段路径的总匝道:name?:可选路口
#1. 路由顺序真的会影响结果
Fiber 官方路由文档明确强调:按声明顺序依次检查。
所以:
app.Get("/:id", func(c fiber.Ctx) error {
return c.SendString("dynamic")
})
app.Get("/me", func(c fiber.Ctx) error {
return c.SendString("fixed")
})请求 /me 时,前面的 /:id 就可能先截走。
正确做法:
app.Get("/me", func(c fiber.Ctx) error {
return c.SendString("fixed")
})
app.Get("/:id", func(c fiber.Ctx) error {
return c.SendString("dynamic")
})在快线城区里,这很好理解:
固定专用车道要先画,模糊的大匝道要后放。
#2. Group 不是实体楼,是“虚拟分区”
api := app.Group("/api")
v1 := api.Group("/v1")
v1.Get("/users", func(c fiber.Ctx) error {
return c.SendString("user list")
})实际效果是:
/api/v1/users但你要注意一个 Fiber 很重要的点:
Group 是虚拟的,最终会展平成带前缀的路由,并按声明顺序执行。
也就是说,它更像“城市规划图上的分区”,不是一个真正独立运行的子系统。
#3. Group 前缀有边界规则
官方文档特别提醒:
/api会匹配/api/api会匹配/api/v1/api不会匹配/apiv1
这很重要,因为很多人会想当然地把它当“字符串前缀匹配”。
不是。
它更像“合法道路边界匹配”。
#4. Group 本身不自动有页面
api := app.Group("/api")
v1 := api.Group("/v1")这不代表访问 /api 或 /api/v1 就一定有响应。
如果你没给这些点位定义具体 handler,直接访问可能是 404。
也就是:
分区图存在,不等于分区入口大厅已经建好。