beego 无原生路由组和版本隔离机制,v2 不支持 group 语法;所有分组靠手动路径拼接,版本控制依赖 url 前缀(如 /v1、/v2)及包路径隔离,需通过 replace 精确管理 v1/v2 导入。

Beego 没有原生的“路由组”概念,v2 版本也不支持类似 Gin 的 Group 语法;所谓“分组”必须靠前缀拼接 + 手动管理,而版本管理的关键在于导入路径和 replace 配置,不是靠路由本身隔离。
beego.Router 不支持嵌套 Group,所有前缀需显式写死
你不能写 router.Group("/v1").Get("/users", ...) 这类代码 —— Beego v2 根本没有 Group 方法。所有“分组”效果都靠字符串拼接实现:
- 手动加前缀:用
beego.Router("/v1/users", &controllers.UserController{}),而不是把/v1抽成公共前缀变量 - 自动路由也一样:
beego.AddAutoPrefix("/v2", &controllers.AdminController{})是唯一带前缀的封装,但它只作用于自动扫描出的方法,不适用于函数式路由 - 若混用函数式路由和控制器路由,前缀必须各自重复写,无法统一收口 —— 容易漏配、难维护
路由版本隔离靠路径前缀,而非框架能力
Beego 不提供基于请求头(如 Accept: application/vnd.myapi.v2+json)或子域名的动态路由分发。版本控制完全落在 URL 路径上:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 正确做法:用不同路径区分版本,例如
/v1/users和/v2/users,各自绑定不同 Controller 或闭包 - 错误幻想:试图用一个路由匹配多个版本(如
beego.Router("/users", ...)再靠中间件判断版本)—— 这会破坏 RESTful 语义,且 Controller 里要写大量 if 分支,违背路由职责 - 注意兼容性:v1 和 v2 的 Controller 不能共用同一个 struct(比如都叫
UserV1Controller和UserV2Controller),否则AutoRouter会冲突
beego v1 和 v2 共存时,路由注册必须按导入路径严格隔离
如果你项目里同时引用了 github.com/astaxie/beego(v1)和 github.com/beego/beego/v2(v2),它们的 beego.Router 是两个完全不同的函数,来自不同包:
- 调用
github.com/beego/beego/v2/server/web.Router注册的路由,只对 v2 的web.Run()生效;v1 的beego.Router对 v2 启动器完全无效 - go.mod 中必须用
replace显式指定每个子模块的版本,例如:replace github.com/beego/beego/v2 => ./vendor/beego/v2<br>replace github.com/astaxie/beego => github.com/astaxie/beego v1.12.3
- 常见错误:在同一个
router.go文件里混用两个版本的beego导入 —— 编译报错或静默失效,因为 Go 不允许同名包并存
真正的难点不在怎么写路由,而在如何让不同版本的路由逻辑不互相污染:路径前缀是唯一可靠锚点,而包路径是唯一可靠隔离边界。别指望框架帮你做分组或版本路由,它只做匹配,其余都得你手写、手管、手测试。










