beego项目必须严格遵循约定:需在gopath/src下初始化,路由注册须在routers/router.go的init()中显式声明,控制器方法须大写首字母并接收*beego.controller指针,配置和日志需手动加载且路径敏感。

Beego 项目开发不是“搭完架子就完事”,而是从 bee new 开始,到路由绑定、控制器响应、配置加载、日志输出,每一步都依赖约定和显式声明。跳过任一环节,beego.Run() 启动后要么 404,要么 panic,要么日志不写、配置不生效。
beego 项目必须在 GOPATH/src 下初始化
这是最常卡住新手的第一步。Beego 的 bee 工具默认按 GOPATH 规范生成目录结构,且硬编码查找 conf/app.conf 和 routers/router.go 的相对路径。不在 $GOPATH/src 下执行 bee new myapp,后续 bee run 会报 conf file not found 或直接 panic。
- 检查当前 GOPATH:
go env GOPATH - 进入对应路径的
src目录:cd $GOPATH/src - 再运行:
bee new myapp(不要加路径) - 生成后,项目根目录必须包含
conf/、controllers/、routers/等标准子目录
路由注册必须在 routers/router.go 的 init() 中完成
Beego 不自动扫描控制器,所有路由必须显式调用 beego.Router、beego.Get 等函数注册。这些调用必须放在 routers/router.go 文件的 init() 函数里——否则 main.go 执行 beego.Run() 时,路由表为空,所有请求返回 404。
- 错误写法:把
beego.Get("/test", ...)写在某个 controller 文件里或 main.go 里 - 正确位置:
routers/router.go中的func init() { beego.Get(...); beego.Router(...) } - 注意参数顺序:
beego.Router("/user/:id([0-9]+)", &controllers.UserController{}, "get:Get;post:Post"),第三个参数是 method:action 映射,不是字符串拼接
控制器方法必须是大写首字母且接收 *beego.Controller 指针
Beego 通过反射调用控制器方法,要求方法名导出(首字母大写)、接收者为 *beego.Controller 类型指针。写成小写方法、或接收 beego.Controller 值类型,运行时不报错但永远不被调用,请求静默失败。
- 合法写法:
func (c *MainController) Get() { c.Ctx.WriteString("ok") } - 非法写法:
func (c MainController) get() {...}(小写 + 值接收者) - 访问参数用
c.Ctx.Input.Param(":id"),不是c.GetString("id")(那是表单字段) -
Prepare()方法会在所有 action 前执行,适合做权限校验,但别在里面写c.StopRun()后还继续往下走逻辑
配置和日志需手动启用且路径敏感
Beego 默认不自动加载 conf/app.conf,也不自动初始化日志。即使文件存在,若没调用 beego.LoadAppConfig() 或 beego.SetLogger(),beego.BeeLogger.Info() 什么都不会输出,beego.AppConfig.String("httpport") 返回空字符串。
- 确保
main.go中beego.Run()前有:beego.LoadAppConfig("ini", "conf/app.conf") - 日志级别默认是
LevelError,调试时记得加:beego.SetLevel(beego.LevelDebug) -
app.conf必须放在项目根目录下的conf/子目录,不能放错层级,也不能用./conf/app.conf这种相对路径传参 - 修改配置后需重启进程,Beego 不支持热重载 app.conf(
bee run的热编译只监听 .go 文件)
真正容易被忽略的是:Beego 的“约定”不是建议,是强制路径与命名规则。它不像 Gin 那样靠函数链式调用自由组合,而是靠目录结构、文件位置、函数签名、init 时机共同构成一个隐式契约。漏掉其中任何一环,程序不会明确报错,只会静默失效。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











