Beego路由生效需满足三前提:注册必须在beego.Run()前、控制器须嵌入beego.Controller、routers包须空白导入;混用beego.Router与beego.Get会覆盖路由;参数必须用ctx.Input.Param(":key")获取,冒号不可省略。

Beego 的路由规则不是“写完就生效”,核心卡点在注册时机、方式选择和参数提取逻辑——三者错一个,404 或 panic 就跟着来了。
beego.Router 和 beego.Get 不能混用同一路径
二者注册机制完全不同:beego.Router 绑定控制器实例,走完整 MVC 生命周期(Prepare、Get、Finish);beego.Get 绑定裸函数,无 Controller 上下文,c.TplName、c.Data 全无效。
- 若先注册
beego.Router("/user", &UserController{}),再注册beego.Get("/user", handler),后者会完全覆盖前者,且失去所有 Controller 能力 - 想做健康检查或简单转发,用
beego.Get;需要模板、Session、Filter 或 ORM 注入,必须用beego.Router - 函数式路由不触发
Prepare/Finish,控制器式路由才触发——别指望在beego.Get闭包里调c.EnableXSRF()
:id、?:id 和 :id([0-9]+) 的匹配行为差异极大
冒号、问号、括号不是装饰,是决定 URL 是否 404 的开关。
-
beego.Router("/api/:id", &APIController{}):路径段强制存在,/api/直接 404,/api/123和/api/abc都能匹配(无类型约束) -
beego.Router("/api/?:id", &APIController{}):路径段可选,/api/、/api/123、/api/abc全部匹配,未提供时ctx.Input.Param(":id")返回空字符串 -
beego.Router("/api/:id([0-9]+)", &APIController{}):显式正则,只匹配数字;:id:int是它的简写,但掩盖细节,UUID 类型(含短横线)必须写:oid([a-z0-9-]+) -
/download/*.*会自动拆出:path和:ext;/files/*只给:splat,且值不含开头的/
命名空间必须用 beego.NSNamespace + beego.AddNamespace
beego.Router("/admin/user", ...) 不是命名空间,只是带前缀的普通路由。真要分组管理、统一挂 Filter、支持嵌套,必须走 NS 流程。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 命名空间对象必须在
init()函数中创建,并显式调用beego.AddNamespace(ns),漏掉这行等于没写 - 子空间 Filter 默认不继承父级,JWT 验证这类全局逻辑得加在最外层命名空间上,而非每个子空间重复写
-
NSNamespace("/api/v1").NSRouter("/users", &UserController{})对应完整路径/api/v1/users,别在NSRouter里再写/api/v1/users - 命名空间内方法映射规则不变:GET 仍调
UserController.Get,和全局beego.Router行为一致
路由不生效?先查这三个硬性条件
Beego 路由不是声明即注册,它依赖 Go 运行时对 init() 的自动调用,缺一不可。
- 控制器包必须被 import,且在
main.go中以空白导入方式触发初始化:_ "yourapp/routers",写成"yourapp/routers"不会执行init() - 所有
beego.Router/beego.Get必须在beego.Run()之前执行,放错位置等于没注册 - 控制器结构体必须嵌入
beego.Controller,方法签名必须是func(*YourController),否则反射失败直接 panic - 调试时加
beego.BeeLogger.Level = logs.LevelDebug,启动日志里会打印全部已注册路由,一眼看出是否注册成功
最容易被忽略的是:参数必须用 ctx.Input.Param(":key") 获取,ctx.Input.Query("key") 拿不到路径参数,ctx.Input.Param("key")(漏冒号)也拿不到——Beego 的 : 是语法必需,不是可选符号。










