今天就捋一捋,如何组织一个优雅的Go Web项目。
├── cmd/ # 项目入口目录
│ └── main.go # 主程序入口
├── internal/ # 私有代码目录
│ ├── handler/ # HTTP处理器(等同于Controller)
│ │ └── user.go
│ ├── service/ # 业务逻辑层
│ │ └── user.go
│ ├── repository/ # 数据访问层(等同于DAO)
│ │ └── user.go
│ └── model/ # 数据模型
│ └── user.go
├── pkg/ # 可被外部引用的包
│ ├── middleware/ # 中间件
│ ├── config/ # 配置
│ └── utils/ # 工具函数
├── api/ # API文档(Swagger/OpenAPI)
│ └── swagger.json
├── configs/ # 配置文件目录
│ └── config.yaml
├── scripts/ # 构建、部署脚本
├── test/ # 测试文件目录
└── go.mod # Go模块文件
为什么要这样组织?
- 关注点分离:handler/service/repository 这种分层架构,是从 Java 等语言借鉴来的最佳实践,可以让代码职责更清晰。
- internal机制:Go的internal目录很特别,其他项目无法导入这个目录下的代码,可以防止核心业务逻辑被外部使用。
- pkg共享机制:想要被其他项目复用的代码就放在pkg下,比如一些通用的中间件、工具函数等。
项目案例推荐:
- Go-Clean-Template: https://github.com/evrone/go-clean-template 这是一个遵循清晰架构的Gin项目模板,star数4k+,值得参考。
- Gin-Vue-Admin: https://github.com/flipped-aurora/gin-vue-admin 一个完整的前后端分离权限管理系统,后端就是用Gin实现的,star数17k+。
个人建议:
举个例子,一个用户注册功能的代码组织:
// internal/handler/user.go
func (h *UserHandler) Register(c *gin.Context) {
// 处理HTTP请求参数
// 调用service层
}
// internal/service/user.go
func (s *UserService) Register(user *model.User) error {
// 处理业务逻辑
// 调用repository层
}
// internal/repository/user.go
func (r *UserRepository) Create(user *model.User) error {
// 数据库操作
}
没有最好的项目结构,只有最适合你团队的结构。以上只是推荐,可以根据实际需求调整。
求加关注的请点赞!你的支持就是我继续创作的动力!
标签:repository,乱放,go,internal,user,Go,解构,pkg From: https://blog.csdn.net/qq_63315166/article/details/144477133