项目结构
小型项目如何组织? 何时拆分 package?
- 小型项目: 优先保持结构简单;
- 拆包时机: 职责稳定后再拆分 package;
hello/
├── go.mod # module 配置文件
├── go.sum # 依赖校验文件
├── main.go # 可执行程序入口
└── calc/ # 普通业务包目录
└── calc.go # calc 包源码
- 拆分依据: 同一职责形成稳定接口、被不同调用方复用或需要独立维护时再拆包;单纯文件变长不代表必须增加包层级;
- 依赖方向: 新包应有清楚的调用方向,避免彼此引用形成包导入环;接口放在需要该行为的一侧通常更容易缩小依赖;
常见分层包含哪些目录? 各层职责是什么?
project/
├── cmd/ # 可执行程序入口集合
│ └── server/ # server 程序入口目录
│ └── main.go # server main 包入口文件
├── internal/ # 受父目录树导入边界约束的内部代码
│ ├── handler/ # 输入输出边界层
│ ├── service/ # 业务规则层
│ └── repository/ # 数据访问层
├── pkg/ # 可被外部 module 复用的公共包
└── go.mod # module 配置文件
- 约定与限制:
cmd放程序入口,pkg可放公共包但并非必需;internal的强制导入规则见可见性; - 分层职责: handler 处理输入输出,service 表达业务规则,repository 隔离存储操作;职责未形成时无需预先建立空层;