fiber中可选参数必须位于路径末尾(如/:name/:age/:gender?),通配符只能出现在路径末尾(如/files/path),且二者混合时仅支持“参数在前、通配在后”(如/user/:id/*assets)。

在Fiber中为同一路径定义可选参数(如/:name/:age/:gender?)或通配符(如/static/*filepath),需严格遵循节点类型顺序与语义限制,否则路由无法注册或匹配失败。
写带问号的可选参数路由
方法一:用?标记末尾参数为可选
在路径末尾参数名后加?,例如/:name/:age/:gender?,表示:gender段可存在也可不存在;Fiber会自动将其编译为两个独立路由节点:/:name/:age和/:name/:age/:gender。
方法二:必须保证可选参数位于路径最右侧
【/user/:id/:role?/edit ❌ 不合法】——Fiber只允许?出现在整个路径的最后一个参数段之后,中间插入会导致解析失败并panic。正确写法只能是/user/:id/edit或/user/:id/:role/edit,不可混用。
方法三:可选参数不参与前缀共享
当注册/:name/:age/:gender?时,Fiber底层会生成两条平行路径树分支,不会和/:name/:age共用同一个参数节点;这意味着/john/30和/john/30/male由不同节点响应,各自绑定不同的参数提取逻辑。
写星号通配符路由
第一步:通配符*只能出现在路径末尾
必须以/*开头且紧接路径段名,如/files/*path、/api/v1/*rest;若写成/a*b/c或/static/*/index.html,Fiber启动时直接报错退出,不加载任何路由。
第二步:通配节点强制排在子节点末位
在radix树中,*path节点永远是当前节点.children切片的最后一个元素;因此/static/*filepath会覆盖同级所有其他子节点(包括静态路径/static/css和参数路径/static/:file),只要请求路径以/static/开头就无条件命中通配分支。
第三步:通配参数通过c.Params("*")获取
不要用c.Params("path")——通配段名只是占位符,实际提取值必须用固定键"*",例如GET /files/a/b/c.txt对应c.Params("*") == "a/b/c.txt";该值包含完整子路径,不含前导斜杠。
混合使用参数与通配符的写法
方法1:参数在前,通配在后(唯一合法组合)
/user/:id/*assets是合法的,表示匹配/user/123、/user/123/avatar.png、/user/123/js/main.js等;但/user/*assets/:id会触发Fiber panic,因为*不能出现在非末尾位置。
方法2:通配符节点独占末尾,不与同级参数节点共存
一旦某节点下注册了*assets,则该节点下所有其他子节点(包括:id、:name等)全部失效;所以/user/:id和/user/*assets不能同时注册在同一父路径下,否则后者将屏蔽前者。
方法3:用路由组隔离冲突场景
若需同时支持/user/:id和/user/static/*file,应把通配路由移入子路径:app.Group("/user").Get("/static/*file", handler),而/user/:id保留在根路由组;这样两者在radix树中处于不同分支,互不干扰。











