Beego基础路由必须在beego.Run()前注册且控制器须嵌入beego.Controller,否则必404或panic;函数式路由用beego.Get/Post绑定闭包,不支持参数提取与Controller特性;控制器式路由通过beego.Router绑定,支持参数、Filter、模板及方法映射。

Beego 的基础路由必须在 beego.Run() 之前注册,且控制器结构体必须嵌入 beego.Controller,否则 404 或 panic 是大概率结果,不是配置遗漏,而是框架机制强制要求。
函数式路由:适合健康检查、简单响应,但不支持 Controller 特性
用 beego.Get、beego.Post 等直接绑定闭包,签名固定为 func(ctx *context.Context),路径不支持参数提取(如 /user/:id 会报错或不匹配)。
- 必须导入
"github.com/beego/beego/v2/server/web/context",否则context.Context类型无法识别 - 不能访问
c.TplName、c.Data、c.Input.Session等字段——因为没 controller 实例 - 示例:
beego.Get("/health", func(c *context.Context) { c.Output.Body([]byte("ok")) }) - 常见错误:在闭包里调
c.Render()或设c.Ctx.Input.Param(":id")却忘了路径没写参数占位符,结果拿不到值
控制器式路由:MVC 标准用法,参数、Filter、模板全支持
beego.Router 绑定控制器实例,HTTP 方法自动映射到对应方法(Get()、Post()),完整走 Prepare → Action → Finish 生命周期。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 控制器必须嵌入
beego.Controller:type UserCtrl struct { beego.Controller } - 路径中
:id表示必需参数,?:id表示可选;:id:int是简写,实际等价于:id([0-9]+),但建议显式写正则以防 UUID、带连字符 ID 等场景翻车 - 第三个参数控制方法映射:
""启用默认映射;"get:List;post:Create"可自定义;"*:Index"表示所有 method 都走Index() - 参数只能通过
c.Ctx.Input.Param(":id")获取,c.Ctx.Input.Param("id")(漏冒号)或c.Ctx.Input.Query("id")都无效
命名空间路由:别用 beego.Router 拼前缀,必须用 beego.NSNamespace
想分组管理 /api/v1/users 和 /api/v1/posts,不能靠 beego.Router("/api/v1/users", ...) 写死路径——这没有命名空间语义,无法统一挂 Filter 或嵌套。
- 必须在
routers/router.go的init()函数里创建并注册:v1 := beego.NSNamespace("/api/v1", ...); beego.AddNamespace(v1) -
NSRouter和NSFilter的路径是相对前缀的,NSNamespace("/api")+NSRouter("/v1/users", &c.UserCtrl{})最终匹配的是/api/v1/users - 子命名空间的
NSFilter不继承父级,JWT 验证这类全局逻辑得加在最外层命名空间上 - 漏掉
beego.AddNamespace(v1)是静默失败——路由完全不生效,日志也不报错
最容易被忽略的一点:所有路由注册(无论函数式还是控制器式)都依赖 init() 被 Go 运行时自动触发。如果控制器包没被 import,或 routers 包没用 _ "yourapp/routers" 空白导入,整个路由表就是空的——启动时不报错,但所有请求都是 404。










