Beego路由是内置核心模块,无需额外安装;需正确引入github.com/beego/beego/v2/server/web并确保go.mod含v2版本,路由注册须在init()中完成,且避免Router与Get混用导致覆盖。

Beego 本身没有独立的“路由组件”需要额外安装——路由能力是框架内置的核心模块,github.com/beego/beego/v2/server/web 就是它实际工作的包。所谓“安装路由”,本质是正确引入、注册并配置这一模块。
确认 beego/v2 已正确安装
如果你用的是 Beego v2(当前主流版本),必须确保安装的是带 /v2 后缀的模块,否则会因导入路径不匹配导致编译失败或运行时 panic:
-
go get -u github.com/beego/beego/v2—— 这是必须的,server/web就在其中 - 别再用旧版
github.com/astaxie/beego,它已废弃,与 v2 不兼容 - 检查
go.mod中是否含github.com/beego/beego/v2 v2.x.x,而不是无版本号或v1
router.go 文件必须被 init() 函数触发
Beego 的路由注册依赖 Go 的包初始化机制。你写的 beego.Router 或 beego.Get 必须放在某个 func init() 里,且该文件要被主程序 import 到(哪怕只是匿名导入)。常见错误是:
- 把路由写在
routers/router.go里,但没在main.go中 import_ "myapp/routers" - 写了
func init(),但函数名拼错成Init()或漏了括号 - 路由代码写在普通函数里(如
setupRoutes()),却没在init()或main()中调用
标准写法示例(routers/router.go):
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
package routers
import (
"myapp/controllers"
"github.com/beego/beego/v2/server/web"
)
func init() {
web.Router("/user", &controllers.UserController{})
web.Get("/health", func(ctx *web.Context) {
ctx.Output.Body([]byte("ok"))
})
}
别混淆 Router 和 Get/Post 的行为差异
同一路径上混用 web.Router 和 web.Get 会导致后者覆盖前者,因为函数式路由优先级更高。更关键的是语义不同:
-
web.Router("/api/:id", &controller.APIController{}):走 Controller 生命周期,可直接用this.Ctx.Input.Param(":id")、this.Data、this.TplName -
web.Get("/api/:id", func(ctx *web.Context) {...}):不创建 Controller 实例,ctx是裸指针,参数要用ctx.Input.Param(":id"),但没有 MVC 辅助字段 - 若你在 Controller 里定义了
Get()方法,却用web.Get绑定同路径,Controller 的Get()根本不会执行
AutoRouter 不适合生产环境
开发阶段图省事用 web.AutoRouter(&controller.UserController{}) 很方便,但它有硬伤:
- 只扫描导出方法(首字母大写),
getName()这种小写方法会被忽略 - 路径固定为
/controllername/methodname,无法自定义前缀或嵌套路由 - 启动时反射扫描所有 controller,项目一大就明显变慢
- 不支持正则参数、RESTful method 映射等高级特性
新项目建议从第一天就用显式 web.Router 或 web.RESTRouter,避免后期重构成本。
真正容易被忽略的是:路由匹配发生在所有 Filter(中间件)之前,如果正则参数写错(比如 :id(int) 却传了字符串),请求会在进入 Filter 前就 404,根本不会走到你写的日志或鉴权逻辑里。


















