官方工程目录结构规范
结论:GoFrame 官方提供约定式分层工程模板(gf init 生成):api 定义对外接口,internal 承载业务实现并按 cmd/controller/logic/dao/model/service 单向分层,manifest 放部署配置,resource 放模板与静态资源,hack 放开发脚本与代码生成配置。
一、目录总览
项目根
├── api/ # 对外接口:Req/Res 结构体 + g.Meta 路由元数据
├── hack/ # 开发辅助:hack/config.yaml(gf gen dao 配置)等
├── internal/ # 内部实现,禁止被外部模块引用
│ ├── cmd/ # 命令行入口定义(main.go 调用 cmd.Main.Run)
│ ├── consts/ # 常量定义
│ ├── controller/ # 控制器:接口实现,保持“薄”
│ ├── dao/ # 数据访问对象(gf gen dao 生成,勿手改)
│ ├── logic/ # 业务逻辑实现
│ ├── model/ # 数据结构:entity/do(生成)与自定义结构
│ ├── packed/ # 资源打包产物(gres)
│ └── service/ # 业务接口定义与实现注册
├── manifest/ # 部署清单:config/(配置文件)、docker/、k8s/ 等
├── resource/ # 静态资源:模板、public、SQL 脚本等
├── utility/ # 项目内通用工具(非框架组件)
├── main.go # 程序入口
└── go.mod
二、关键规范
- 依赖方向:controller → logic → dao(配合 model/service),禁止反向或跨层直接依赖;跨模块调用通过 service 接口解耦。
- dao/model 的 entity、do 由代码生成维护:表结构变更后重新执行 gf gen dao,不要手工修改。
- 配置默认目录:manifest/config/config.yaml;多环境通过 GF_GCFG_FILE 等切换文件名(见配置章节)。
- 入口约定:main.go 只负责调用 cmd.Main.Run(gctx.GetInitCtx()),具体命令在 internal/cmd 中定义。
常见追问 / 记忆点
- 追问:为什么 controller 要做得“薄”?→ 业务下沉到 logic 便于复用与单元测试,避免接口层膨胀。
- 追问:service 与 logic 的分工?→ service 定义接口并注册实现,logic 完成实现,controller 面向 service 编程,实现依赖倒置。
- 记忆点:api 在外、internal 在内、manifest/resource 管资源、hack 管代码生成。