beego路由404最常见原因是控制器未正确嵌入web.controller、方法名未严格使用首字母大写的get/post等、文件不在controllers目录或包名非controllers,且autorouter仅按约定自动生成/user/get类路径而非资源路径。

Beego 的路由和控制器不是靠“写完就自动生效”工作的,必须严格满足嵌入、命名、目录、包名四重约定,否则方法根本不会被注册到路由表里。
为什么写了 Get() 方法却 404?
最常见原因是结构体没嵌入 web.Controller,或方法名不符合规范。Beego 不识别 get()、Index()、HandleGet() 这类变体,只认 Get()、Post()、Put()、Delete() 且首字母大写。
- 必须用
type XController struct { web.Controller }形式嵌入,不能是组合字段(如Ctrl web.Controller),也不能是指针嵌入(*web.Controller) - 控制器文件必须放在
controllers/目录下,且包名必须是controllers - 方法签名必须是
func (c *XController) Get(),接收者类型不能是值类型(func (c XController) Get()不生效) - 如果启用了
AutoRouter(默认开启),但没看到路由日志,先检查bee run启动时是否报错 “no controller found”
如何让 /user/:id 正确绑定到 Get() 方法参数?
Beego 的 AutoRouter 对路径参数的支持是隐式且严格的:路径段写成 :id,方法内必须声明一个同名 id string 参数,框架才会自动注入;否则得手动调 c.Ctx.Input.Param(":id")。
- 正确写法:
func (c *UserController) Get(id string) { ... },对应路由/user/:id - 错误写法:
func (c *UserController) Get(uid string)—— 名字不匹配,uid始终为空字符串 - 若需转为 int,必须自己转换:
id, _ := strconv.Atoi(c.Ctx.Input.Param(":id")),别指望框架自动做类型推导 - 正则约束要显式写,比如只匹配数字:
/user/:id([0-9]+),否则:id会匹配任意非斜杠字符
beego.Router() 和 beego.AutoRouter() 能混用吗?
能,但优先级有明确顺序:固定路由 > 正则路由 > 自动路由。一旦某条请求匹配上前面的规则,就不会再进 AutoRouter。
- 手动注册的
beego.Router("/api/user", &controllers.UserController{})永远优先于beego.AutoRouter(&controllers.UserController{}) - 如果同时注册了
beego.Router("/user/:id", ...)和beego.AutoRouter(&controllers.UserController{}),访问/user/123会走前者,/user/abc可能 fallback 到后者(取决于正则是否匹配) - AutoRouter 注册后,实际生成的路由是
/user/get、/user/post这类形式,不是/user—— 它本质是按方法名映射,不是按资源路径 - 调试时看控制台启动日志里的 “registered router” 行,能清楚看到每条路由的来源和目标方法
真正容易被忽略的是:Beego 的路由注册发生在应用初始化阶段,所有 beego.Xxx() 调用必须在 main() 执行前完成(通常放 init() 或 main() 开头),放到 handler 里调用完全无效。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











