官方工程目录结构规范

结论: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 管代码生成。
笔记加载中…