通配符*path必须位于路径末尾,否则启动报错invalid pattern;它捕获剩余全部路径且返回值带前导斜杠,而+path不带前导斜杠;二者均不可嵌套,也不支持与命名参数混用。

通配符路由在 Fiber 中不能随便放,*path 必须出现在路径末尾,否则启动直接报 invalid pattern;它捕获的是“剩余全部路径”,包括前导斜杠,这点和 +path 不同。
通配符只能放在路径末尾,否则启动失败
Fiber 的路由解析器在构建基数树时,会校验通配符位置。一旦发现 * 或 + 出现在非末尾段(比如 /files/:id/*ext 或 /api/*v/*sub),就会拒绝加载并 panic。
-
app.Get("/static/*filepath", handler)✅ 合法,*filepath是最后一段 -
app.Get("/users/*id/posts", handler)❌ 启动报错:invalid pattern: /users/*id/posts -
app.Get("/v1/*", handler)✅ 合法(等价于/v1/*path),但不推荐省略参数名,不利于调试
*path 和 +path 返回值带不带前导斜杠?
这是最容易写错的地方:两者都捕获“从匹配点开始的剩余路径”,但语义不同。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
-
*path:返回值带前导/,例如请求/files/a/b/c.txt匹配/files/*filepath→c.Params("filepath")得到"/a/b/c.txt" -
+path:返回值不带前导/,同样请求 → 得到"a/b/c.txt",更便于拼接本地文件路径或转发 - 二者都不能嵌套使用,
/a/+b/+c是非法路由,解析器直接拒绝
可选参数 ?optional 和通配不是一回事
新手常把 :id? 当成通配简化写法,其实完全无关:
-
/posts/:id?:只匹配/posts或/posts/123,id是单一段、不可含斜杠 -
/posts/*rest:匹配/posts、/posts/123、/posts/123/comments/456—— 捕获整段后缀 -
/posts/:id?/*rest❌ 语法错误,Fiber 不支持混合写法
别用通配代替参数校验,性能差且难维护
有人为图省事写 app.Get("/user/*id", handler) 试图捕获任意用户路径,这既低效又危险:
- 通配节点查找比参数节点慢 3–5 倍,因为要回溯整个剩余路径
- 无法区分
/user/123和/user/123/profile,全扔给一个 handler 处理,逻辑膨胀 - 正确做法是分层:用
/user/:id处理主资源,/user/:id/profile单独注册,由 radix 树自动优先匹配更具体的路径
真正要用通配时,基本就两类场景:静态文件服务(/static/*filepath)和反向代理兜底(/api/*path)。其他情况,优先拆成明确的命名参数路由 —— 不是限制表达力,而是守住可读性与性能边界。










