beego项目必须在gopath/src下用bee new初始化,否则包导入失败、路由未注册、模板不渲染;router.go需显式注册路由;模板路径和数据字段名须严格匹配。

Beego 项目不能随便建目录就跑,必须在 GOPATH/src 下用 bee new 初始化,否则包找不到、路由不生效、模板不渲染——这是新手踩坑率最高的地方。
beego项目必须放在GOPATH/src下创建
Beego 的 bee 工具仍依赖传统 GOPATH 模式解析 import 路径,即使项目有 go.mod,它也只认 $GOPATH/src/myproject 这种结构。
- 错误做法:
mkdir myapp && cd myapp && bee new .→main.go中的import "myapp/controllers"会报cannot find package "myapp/controllers" - 正确做法:先执行
go env GOPATH确认路径(如/home/user/go),然后cd /home/user/go/src,再运行bee new myapp - 验证是否成功:生成的目录应为
$GOPATH/src/myapp/,且main.go里 import 的路径(如"myapp/controllers")能与该位置严格对应
routers/router.go必须显式注册路由
Beego 不会自动扫描控制器方法,所有路由都得手动写进 routers/router.go 的 init() 函数里。没注册 = 不响应请求。
- 常见现象:
bee run启动后访问/返回 404,或自定义的MainController.Get()完全不触发 - 关键写法:
beego.Router("/", &controllers.MainController{})—— 注意是&controllers.XxxController{},不是controllers.XxxController(类型而非实例) - 轻量替代:如果只是返回字符串,直接用
beego.Get("/", func(ctx *context.Context) { ctx.WriteString("OK") })更快,无需写控制器
模板渲染要同时满足三个硬性条件
写 c.TplName = "index.tpl" 不等于页面就能出来,Beego 对模板路径、字段名、启动方式都有强约定。
- 路径必须匹配:
views/index.tpl存在,且大小写一致;若放views/admin/index.tpl,就得写c.TplName = "admin/index.tpl" - 数据字段名要和模板变量对齐:传
c.Data["Website"] = "beego.dev",模板里就得写{{.Website}},不是{{.Data.Website}} - 必须调
beego.Run():只写http.ListenAndServe()或漏掉这句,模板引擎根本不会启用,TplName被忽略
Controller 方法命名和嵌入规则不能错
Beego 靠反射识别 Controller,不是靠继承或接口,任何偏差都会导致方法被跳过。
- 结构体必须嵌入
beego.Controller(不是组合、不是指针、不能省略),例如:type MainController struct { beego.Controller } - HTTP 方法必须首字母大写 + 动词前缀:
Get()可以,get()或GET()不行 - 参数绑定只认
:id形式:写/user/:id路由,对应方法签名必须是Get(id string);想转 int 得自己调c.Ctx.Input.Param(":id")再转换
最容易被忽略的是:修改了 app.conf 或新增了控制器文件后,不重启 bee run,改动不会生效——Beego 的热重载只监听 .go 文件变更,且仅限 dev 模式。











