GO分层架构【2】使用GIN与GORM
现在大家都使用的的GIN和GORM开发架构是怎么样的目前在 Go 社区中基于 Gin 和 GORM 的主流微服务开发架构最推崇的是 “工程化分层”。它在你的基础上通过引入 Logic/Service 层 和 Repository 层彻底解决代码臃肿和难以测试的问题。以下是目前最流行的标准架构拆解1. 核心分层架构图数据流向遵循请求 → Handler → Logic → Repository → Database。internal/ ├── handler/ # (入口层) 负责 Gin 的参数绑定、简单校验、返回 JSON ├── logic/ # (业务层) 核心是大脑组合业务步骤不涉及具体 SQL ├── repository/ # (持久层) 只有这里出现 GORM负责具体的增删改查 ├── model/ # (模型层) 定义 GORM 结构体Table Schema └── middleware/ # (中间件) 权限校验、日志记录2. 各层代码示例以“用户充值”为例第一层model(定义表结构)package model type User struct { ID uint gorm:primaryKey Balance int64 gorm:column:balance // 余额 }第二层repository(数据操作 - 只有它认识 GORM)package repository import your-project/internal/model import gorm.io/gorm type UserRepo struct { db *gorm.DB } func (r *UserRepo) UpdateBalance(id uint, amount int64) error { // 纯粹的数据库操作 return r.db.Model(model.User{}).Where(id ?, id). Update(balance, gorm.Expr(balance ?, amount)).Error }第三层logic(业务核心 - 这里处理复杂逻辑)package logic import your-project/internal/repository type UserLogic struct { repo *repository.UserRepo } func (l *UserLogic) Recharge(userId uint, money int64) error { // 1. 这里处理业务规则比如充值不能小于 0 if money 0 { return errors.New(金额错误) } // 2. 调用数据层 return l.repo.UpdateBalance(userId, money) }第四层handler(Gin 入口 - 只管翻译)package handler import your-project/pkg/res // 你之前定义的统一返回 func RechargeHandler(c *gin.Context) { var req struct { UserId uint; Amount int64 } c.ShouldBindJSON(req) // 参数解析 // 调用 Logic 层 err : logic.NewUserLogic().Recharge(req.UserId, req.Amount) if err ! nil { c.JSON(200, res.Error(500, err.Error())) return } c.JSON(200, res.Success(nil)) // 统一格式返回 }3. 为什么这是主流GORM 不外溢GORM 的代码只出现在repository或infra。如果你哪天想换sqlx或ent只需要改底层不需要动logic和handler。Logic 层可复用API 调用通过handler调logic。定时任务通过cron调logic。自检脚本通过test/client调logic。并发安全与事务主流做法是在logic层通过闭包或 Context 处理事务确保业务的原子性。4. 针对你现状的调整建议将infra细化你现在的infra可能只是初始化 DB 连接。建议在infra下建一个repository子目录专门写 GORM 的查询。增加logic文件夹把你handler里那些复杂的if-else、计算、多步 SQL 写入全部挪到logic里。统一返回继续使用你放在pkg/res下的结构体这是非常地道的做法。避坑指南在 GORM 开发中千万不要把*gin.Context传进logic层或数据库层这会导致你的业务逻辑和 HTTP 框架死死锁定。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2547103.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!