beego.get和beego.router本质不同:前者绑定裸函数,无controller上下文、不支持路径参数和模板渲染;后者绑定嵌入beego.controller的结构体,走完整mvc生命周期,支持参数提取、filter、session等。

beego.Get 和 beego.Router 是 Beego 路由配置的两个入口,选错方式会导致 404、参数拿不到、模板不渲染,甚至方法根本没被调用。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
用 beego.Get 等函数式路由时,别指望有 Controller 上下文
它绑定的是裸函数,不是控制器实例,所以:
- c.TplName、c.Data、c.ServeJSON() 全部无效
- c.Ctx.Input.Param(":id") 可以取路径参数,但 c.Ctx.Input.Query("q") 才是查 URL 查询参数
- 不触发 Prepare()、Finish(),也不走 Filter 链
- 路径不支持 :id 形式(beego.Get("/user/:id", ...) 会直接 404)
- 必须确保导入 "github.com/beego/beego/v2/server/web/context",否则 *context.Context 类型报错
用 beego.Router 绑定控制器前,先确认三件事
漏掉任一环,路由就静默失效:
- 控制器结构体必须嵌入 beego.Controller(不是组合、不是指针、不能省略)
- 方法名必须首字母大写且以 HTTP 动词开头:例如 Get()、Post(),小写的 get() 不会被识别
- beego.Router 调用必须在 beego.Run() 之前,且所在包(通常是 routers/router.go)要被 _ "yourapp/routers" 空白导入,否则 init() 不执行,路由零注册
:id、?:id、:id:int 的实际行为差异
这些不是语法糖,而是匹配逻辑开关:
- /user/:id:路径段强制存在,/user/ 直接 404
- /user/?:id:路径段可选,/user/ 和 /user/123 都能命中,未提供时 ctx.Input.Param(":id") 返回空字符串
- :id:int 实际等价于 :id([0-9]+),但隐藏了正则细节;真实业务中建议显式写 :id([a-zA-Z0-9_\-]{32}),避免 UUID 或 token 匹配失败
- 字面量点号必须转义:/static/css\.min\.css,否则 . 被当通配符
命名空间和 AutoRouter 是两个高危功能
它们看起来省事,实则掩盖问题:
- beego.AutoRouter 依赖文件位置、包名、方法名大小写,启动慢、不可控、无日志提示失败原因;生产环境必须禁用
- 命名空间不能靠 beego.Router("/api/v1/...") 模拟,必须用 beego.NSNamespace("/api/v1") + beego.AddNamespace() 显式注册,漏掉 AddNamespace 整个命名空间彻底消失
- NSFilter 的 "*" 只作用于当前命名空间内路由,不会穿透到子空间,需要全局中间件得挂最外层
真正卡住人的往往不是怎么写,而是 init() 没触发、包没被导入、路径拼写大小写不一致、或者把 beego.Get 当成 beego.Router 用却还期待模板渲染。调试时打开 beego.BeeLogger.Level = logs.LevelDebug,看启动日志里有没有你注册的那条路由——没有,就说明它根本没进系统。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










