Go中的分层架构
在 Go 项目(尤其是基于 Web 框架的后端项目)中,api
目录下的 controller
、 service
、dao
和 entity
代表了一种分层架构(Layered Architecture),这种设计模式有助于保持代码的清晰性、可维护性和扩展性。
controller
(控制层)
作用: 负责处理 HTTP 请求,调用
service
层,返回响应。特点:
- 作为 MVC(Model-View-Controller)架构中的 Controller。
- 解析 HTTP 请求参数,进行基本校验。
- 调用
service
层完成业务逻辑。 - 返回 HTTP 响应(JSON、HTML等)。
示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17package controller
import (
"my-go-api/api/service"
"github.com/gin-gonic/gin"
"net/http"
)
func GetUser(c *gin.Context) {
id := c.Param("id")
user, err := service.GetUserByID(id)
if err != nil {
c.JSON(http.StatusNotFound, gin.H{"message": "User not found"})
return
}
c.JSON(http.StatusOK, user)
}关键点:直接与 HTTP 交互,不涉及业务逻辑。
service
(业务逻辑层)
作用: 处理核心业务逻辑,调用
dao
层获取数据。特点:
- 负责数据处理、计算、事务管理。
- 结合多个
dao
层方法,实现复杂业务逻辑。 - 让
controller
只关注 HTTP 相关的内容,解耦业务逻辑。
示例:
1
2
3
4
5
6
7
8
9
10package service
import (
"my-go-api/api/dao"
"my-go-api/api/entity"
)
func GetUserByID(id string) (*entity.User, error) {
return dao.FindUserByID(id)
}关键点:处理业务逻辑,但不直接操作数据库。
dao
(数据访问层,Data Access Object)
作用: 负责数据库操作,如增删改查。
特点:
- 负责数据的存储、查询和更新。
- 只提供数据访问,不涉及业务逻辑。
- 使用 ORM(如
gorm
)或原生 SQL 查询数据库。
示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14package dao
import (
"my-go-api/api/entity"
"my-go-api/pkg/db"
)
func FindUserByID(id string) (*entity.User, error) {
var user entity.User
if err := db.Conn.Where("id = ?", id).First(&user).Error; err != nil {
return nil, err
}
return &user, nil
}关键点:只关注数据库操作,不处理业务逻辑。
entity
(数据实体层)
作用: 定义数据库模型(即表结构)。
特点:
- 直接映射数据库表(可配合 ORM,如
gorm
)。 - 定义数据结构,通常与数据库字段一致。
- 直接映射数据库表(可配合 ORM,如
示例:
1
2
3
4
5
6
7
8package entity
type User struct {
ID uint `gorm:"primaryKey"`
Name string `gorm:"size:255"`
Email string `gorm:"unique"`
Password string
}关键点:仅作为数据结构的定义,不包含业务逻辑。
优点
- 代码解耦: 每一层只关注自己的职责,避免
controller
直接操作数据库,使代码更清晰。 - 可维护性强: 各层职责单一,后续修改某一部分不会影响整个项目。
- 易扩展: 未来如果要更换数据库(如 MySQL → MongoDB),只需要改
dao
层。 - 适用于大规模项目: 层次分明,适合团队协作,开发效率更高。
小结
层级 | 作用 | 主要功能 |
---|---|---|
controller |
处理 HTTP 请求 | 解析参数、调用 service 层、返回 JSON 响应 |
service |
业务逻辑层 | 业务处理、数据计算、调用 dao 层 |
dao |
数据访问层 | 负责数据库增删改查,不处理业务逻辑 |
entity |
数据模型层 | 定义数据库表结构 |