当前位置: 首页 > news >正文

golang项目CRUD示例

目录

项目结构

数据库的连接

实体类

Repository层(crud)

Service层

接口层

main.go

Router.go


项目结构

myproject/
├── cmd/
│   └── server/
│       └── main.go
├── internal/
│   ├── config/
│   │   └── db.go
│   ├── model/
│   │   └── student.go
│   ├── repository/
│   │   └── student_repo.go
│   ├── service/
│   │   └── student_service.go
│   └── handler/
│       └── student_handler.go
├── pkg/
│   └── utils/
│       └── response.go
├── api/
│   └── swagger.md  # 可选
├── scripts/
│   └── run.sh
├── web/            # 可放前端资源
├── go.mod
└── go.sum

数据库的连接

package configimport ("fmt""log""gorm.io/driver/mysql""gorm.io/gorm""gorm.io/gorm/schema"
)var DB *gorm.DBfunc InitDB() {user := "root"password := "your_password"host := "127.0.0.1"port := "3306"dbname := "students"dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local",user, password, host, port, dbname)var err errorDB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{NamingStrategy: schema.NamingStrategy{SingularTable: true, // 使用单数表名},})if err != nil {log.Fatalf("数据库连接失败: %v", err)}log.Println("✅ MySQL 数据库连接成功")
}

实体类

go语言中类名和列名首字母大写才能被外部访问,Student对应数据库库students,可以在数据库连接的时候配置使用单数表名

package modeltype Student struct {Id        uint   `gorm:"primaryKey" json:"id"`Name      string `json:"name"`Age       int    `json:"age"`Major     string `json:"major"`ClassRoom string `json:"class_room"`
}

Repository层(crud)

package repositoryimport ("go-student-project/internal/config""go-student-project/internal/model"
)func CreateStudent(student *model.Student) error {return config.DB.Create(student).Error
}func GetAllStudents() ([]model.Student, error) {var students []model.Studenterr := config.DB.Find(&students).Errorreturn students, err
}func GetStudentByID(id uint) (model.Student, error) {var student model.Studenterr := config.DB.First(&student, id).Errorreturn student, err
}func UpdateStudent(student *model.Student) error {return config.DB.Save(student).Error
}func DeleteStudent(id uint) error {return config.DB.Delete(&model.Student{}, id).Error
}

Service层

package serviceimport ("go-student-project/internal/model""go-student-project/internal/repository"
)func CreateStudent(student *model.Student) error {return repository.CreateStudent(student)
}func GetAllStudents() ([]model.Student, error) {return repository.GetAllStudents()
}func GetStudent(id uint) (model.Student, error) {return repository.GetStudentByID(id)
}func UpdateStudent(student *model.Student) error {return repository.UpdateStudent(student)
}func DeleteStudent(id uint) error {return repository.DeleteStudent(id)
}

接口层

package handlerimport ("go-student-project/internal/model""go-student-project/internal/service""go-student-project/pkg/utils""net/http""strconv""github.com/gin-gonic/gin"
)func AddStudent(c *gin.Context) {var student model.Studentif err := c.ShouldBindJSON(&student); err != nil {utils.Error(c, "参数绑定失败", 400)return}if err := service.CreateStudent(&student); err != nil {utils.Error(c, "创建失败", 500)return}utils.Success(c, student, "学生创建成功")
}func ListStudents(c *gin.Context) {students, err := service.GetAllStudents()if err != nil {utils.Error(c, "查询失败", 500)return}utils.Success(c, students, "查询成功")
}func GetStudent(c *gin.Context) {id, _ := strconv.Atoi(c.Param("id"))student, err := service.GetStudent(uint(id))if err != nil {utils.Error(c, "学生不存在", 404)return}utils.Success(c, student, "查询成功")
}func UpdateStudent(c *gin.Context) {id, _ := strconv.Atoi(c.Param("id"))var input model.Studentif err := c.ShouldBindJSON(&input); err != nil {utils.Error(c, "参数错误", 400)return}student, err := service.GetStudent(uint(id))if err != nil {utils.Error(c, "学生不存在", 404)return}// 更新允许修改的字段student.Name = input.Namestudent.Age = input.Agestudent.Major = input.Majorstudent.ClassRoom = input.ClassRoomif err := service.UpdateStudent(&student); err != nil {utils.Error(c, "更新失败", 500)return}utils.Success(c, student, "更新成功")
}func DeleteStudent(c *gin.Context) {id, _ := strconv.Atoi(c.Param("id"))if err := service.DeleteStudent(uint(id)); err != nil {utils.Error(c, "删除失败", 500)return}utils.Success(c, nil, "删除成功")
}

统一处理(和Java中自定义Result<T>很像)

package utilsimport ("github.com/gin-gonic/gin"
)func JsonResponse(c *gin.Context, code int, msg string, data any) {c.JSON(200, gin.H{"code": code,"msg":  msg,"data": data,})
}func Success(c *gin.Context, data any, msg string) {JsonResponse(c, 200, msg, data)
}func Error(c *gin.Context, msg string, code int) {JsonResponse(c, code, msg, nil)
}

main.go

package mainimport ("go-student-project/internal/config""go-student-project/internal/handler""github.com/gin-gonic/gin"
)func main() {// 初始化数据库config.InitDB()config.DB.AutoMigrate(&handler.Student{}) // 或 model.Student// 初始化路由r := gin.Default()studentGroup := r.Group("/student"){studentGroup.POST("/", handler.AddStudent)studentGroup.GET("/", handler.ListStudents)studentGroup.GET("/:id", handler.GetStudent)studentGroup.PUT("/:id", handler.UpdateStudent)studentGroup.DELETE("/:id", handler.DeleteStudent)}r.Run(":8080")
}

Router.go

package routerimport ("student/controller""github.com/gin-gonic/gin"
)func InitRouter() *gin.Engine {engine := gin.Default()engine.POST("/student", controller.AddStudent)engine.GET("/student", controller.GetStudent)engine.PUT("/student/:id", controller.UpdateStudent)engine.DELETE("/student/:id", controller.DeleteStudent)return engine
}
http://www.dtcms.com/a/592569.html

相关文章:

  • 小米网站 用什么做的项城网站设计
  • Go语言数据竞争全面解析与解决方案
  • 重塑 exec.Command:打造更可控的 Go 命令执行器
  • 【译】借助提示词、资源和采样,在 Visual Studio 中充分利用 MCP
  • 华为OD机试 双机位A卷 - 整理版本号 (JAVA Python C++ JS GO)
  • 【C++初阶】vector容器的模拟实现,各接口讲解
  • QGIS 3.34+ 网络分析基础数据自动化生成:从脚本到应用
  • 第2章-类加载子系统-知识补充
  • Go Fiber 简介
  • 专业酒店设计网站建设手机什么网站可以设计楼房
  • 20251110给荣品RD-RK3588开发板跑Rockchip的原厂Android13系统时熟悉散热风扇
  • UniApp自定义Android基座原理及流程
  • Ganache-CLI以太坊私网JSON-RPC接口执行环境搭建
  • Android 系统超级实用的分析调试命令
  • 【ZeroRange WebRTC】WebRTC 加密安全总览:对称/非对称、数字签名、证书、SHA/HMAC、随机数
  • 【ZeroRange WebRTC】数字签名与 WebRTC 的应用(从原理到实践)
  • 承德网站制作公司做国外的网站有什么不用钱的
  • 破解遗留数据集成难题:基于AWS Glue的无服务器ETL实践
  • Rust 的所有权系统,是一场对“共享即混乱”的编程革命
  • 【Rust 探索之旅】Rust 库开发实战教程:从零构建高性能 HTTP 客户端库
  • API 设计哲学:构建健壮、易用且符合惯用语的 Rust 库
  • 横沥镇做网站wordpress中文说明书
  • 先做个在线电影网站该怎么做贵阳做网站软件
  • 【字符串String类大集合】构造创建_常量池情况_获取方法_截取方法_转换方法_String和基本数据类型互转方法
  • Http请求中Accept的类型详细解析以及应用场景
  • 升鲜宝 供应链SCM 一体化自动化部署体系说明
  • grafana配置redis数据源预警误报问题(database is locked)
  • 拒绝繁琐,介绍一款简洁易用的项目管理工具-Kanass
  • 测试自动化新突破:金仓KReplay助力金融核心系统迁移周期缩减三周
  • 大语言模型入门指南:从科普到实战的技术笔记(1)