Go中的分层架构

  在 Go 项目(尤其是基于 Web 框架的后端项目)中,api 目录下的 controllerservicedaoentity 代表了一种分层架构(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
    17
    package 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
    10
    package 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
    14
    package 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)。
    • 定义数据结构,通常与数据库字段一致。
  • 示例:

    1
    2
    3
    4
    5
    6
    7
    8
    package entity

    type User struct {
    ID uint `gorm:"primaryKey"`
    Name string `gorm:"size:255"`
    Email string `gorm:"unique"`
    Password string
    }
  • 关键点:仅作为数据结构的定义,不包含业务逻辑。

优点

  1. 代码解耦: 每一层只关注自己的职责,避免 controller 直接操作数据库,使代码更清晰。
  2. 可维护性强: 各层职责单一,后续修改某一部分不会影响整个项目。
  3. 易扩展: 未来如果要更换数据库(如 MySQL → MongoDB),只需要改 dao 层。
  4. 适用于大规模项目: 层次分明,适合团队协作,开发效率更高。

小结

层级 作用 主要功能
controller 处理 HTTP 请求 解析参数、调用 service 层、返回 JSON 响应
service 业务逻辑层 业务处理、数据计算、调用 dao
dao 数据访问层 负责数据库增删改查,不处理业务逻辑
entity 数据模型层 定义数据库表结构
作者

Fu9Zhou

发布于

2025-03-01

许可协议