go语言学习笔记:gin + gorm + mysql 用户增删改查案例入门

大家好,我是此林。

Golang 语言现在已经成为了编程的趋势,毕竟是大厂背书嘛,Google 研发的。

目前很多云原生项目都是基于 go 来编写的,比如:

        Kubernetes (K8s)​ 容器编排系统,

        Docker​ 容器化技术,

        etcd​ 分布式键值存储(Kubernetes 的默认存储),

        Prometheus​ 监控 & 告警系统,

        Istio​ 服务网格(Service Mesh,用于流量管理、安全策略、可观测性)

​💡 Go 的优势​

✅ ​​编译速度快​​(比 C++/Java 快)
✅ ​​静态二进制文件​​(部署简单,无依赖)
✅ ​​原生并发支持​​(goroutine + channel)

那作为一个 Javaer,我们用熟练了 springboot,gin + grom 那一套东西,上手也可以说很快。今天来看一个案例:user 增删查改。

目录

1. Go 安装

2. 项目开始

2.1. 初始化配置

2.2. sql 设计

2.3. db.go 数据库配置

2.4. user.go 实体类设计

2.5. controller 设计

2.6 main.go 主程序

3. postman 接口测试


1. Go 安装

这个不多说,下载安装 + 配置环境变量,笔者用的是 1.23.8 稳定版。

安装完记得用 go env -w 配置下 mod 的国内代理,mod 相当于 Maven,是依赖管理工具。

和 java 不同,mod 是 go 语言自带的,无需另外安装。

 vscode 里配置插件,这里就不用笨重的 Goland 了。

2. 项目开始

2.1. 初始化配置

mkdir go-crud
cd go-crud
go mod init go-crud

然后创建下面的目录结构

go-crud/
├── main.go
├── models/
│   └── user.go
├── controllers/
│   └── user_controller.go
├── config/└── db.go

看样子,和 spring mvc 还有点像。

2.2. sql 设计

已经提前创建好了 user 表,四个字段:id,name,age,sex。

SQL自取。

create table users
(id   bigint unsigned auto_incrementprimary key,name longtext null,age  bigint   null,sex  bigint   null
);INSERT INTO users (name, age, sex) 
VALUES ('李四', 30, 1),('王五', 28, 0),('赵六', 22, 1);

2.3. db.go 数据库配置

package configimport ("fmt""gorm.io/driver/mysql""gorm.io/gorm"
)var DB *gorm.DBfunc ConnectDB() {dsn := "root:123456@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local"db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})if err != nil {panic("数据库连接失败:" + err.Error())}DB = dbfmt.Println("数据库连接成功!")
}

有点陌生?别担心,多去浏览浏览菜鸟教程的 Go 基本语法就行。

1. fmt.Println():相当于 java 里的 System.out.println()

2. dsn := "...":这是go里定义局部变量的简化写法

当然也可以写成 var dsn = "...",这种定义可以作为全局或者局部变量。

或者 var dsn string = "..." 也可以,不写明类型go会自动类型推导。

2.4. user.go 实体类设计

package modelstype User struct {Id uint `json:"id" gorm:"primaryKey"`Name string `json:"name"`Age int `json:"age"`Sex int `json:"sex"`
}
func (User) TableName() string {return "user"  // 强制表名为 "user"(而不是默认的 "users")
}

在 Go 的结构体定义中,​`json:"xxx"`​ 和 ​`gorm:"xxx"`​ 这些是 ​​结构体标签(Struct Tags)​​,它们为字段提供额外的元信息(metadata),用于控制 JSON 序列化/反序列化、数据库映射等行为。

比如json标签:

`json:"id"`   // 指定该字段在JSON中的键名
`json:"-"`    // 忽略此字段(不参与JSON序列化)
`json:"name,omitempty"` // 如果字段为空值(0、""、nil等),JSON中省略此字段

详细来说,就是如下:

type User struct {Id   uint   `json:"id" gorm:"primaryKey"`  // JSON键名=id,数据库主键Name string `json:"name"`                  // JSON键名=nameAge  int    `json:"age"`                   // JSON键名=ageSex  int    `json:"sex"`                   // JSON键名=sex
}

2.5. controller 设计

package controllersimport ("go-crud/config""go-crud/models""github.com/gin-gonic/gin""net/http"
)// 创建用户
func CreateUser(c *gin.Context) {var user models.Userif err := c.ShouldBindJSON(&user); err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})return}config.DB.Create(&user)c.JSON(http.StatusOK, user)
}// 查询所有用户
func GetUsers(c *gin.Context) {var users []models.Userconfig.DB.Find(&users)c.JSON(http.StatusOK, users)
}// 查询单个用户
func GetUserById(c *gin.Context) {var user models.Userid := c.Param("id")if err := config.DB.First(&user, id).Error; err != nil {c.JSON(http.StatusNotFound, gin.H{"error": "用户未找到"})return}c.JSON(http.StatusOK, user)
}// 更新用户
func UpdateUser(c *gin.Context) {var user models.Userid := c.Param("id")if err := config.DB.First(&user, id).Error; err != nil {c.JSON(http.StatusNotFound, gin.H{"error": "用户未找到"})return}var input models.Userif err := c.ShouldBindJSON(&input); err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})return}user.Name = input.Nameuser.Age = input.Ageuser.Sex = input.Sexconfig.DB.Save(&user)c.JSON(http.StatusOK, user)
}// 删除用户
func DeleteUser(c *gin.Context) {var user models.Userid := c.Param("id")if err := config.DB.First(&user, id).Error; err != nil {c.JSON(http.StatusNotFound, gin.H{"error": "用户未找到"})return }config.DB.Delete(&user)c.JSON(http.StatusOK, gin.H{"message": "用户已删除"})
}

这里每个函数都要加 c *gin.Context,可以理解为请求request和响应response都在里边。当做规则,记住就好。 

id := c.Param("id") 就是获取请求中的id。

c.JSON(http.StatusOK, gin.H{"message": "用户已删除"}) 就是返回 json 响应,restful 规范。

 可以看到,使用了 gorm,大部分 sql 我们都不用手写。

当然也可以使用 config.DB = config.DB.Debug()  打印实际执行的SQL。在复杂查询时,也是可以自定义 SQL 的。

2.6 main.go 主程序

最后一步了!

package mainimport ("go-crud/config""go-crud/controllers""go-crud/models""github.com/gin-gonic/gin"
)func main() {// 连接数据库config.ConnectDB()// 自动迁移config.DB.AutoMigrate(&models.User{})// 设置路由r := gin.Default()r.POST("/users", controllers.CreateUser) // 创建用户r.GET("/users", controllers.GetUsers)     // 查询所有用户r.GET("/users/:id", controllers.GetUserById) // 查询单个用户r.PUT("/users/:id", controllers.UpdateUser) // 更新用户r.DELETE("/users/:id", controllers.DeleteUser) // 删除用户r.Run(":1234") // 启动服务
}

这里无非是先初始化数据库连接。

我们以前 springboot里,是把 mysql 连接信息写在 yml 里,然后 spring 把它封装为 Bean 吧?

Go 里稍微不同,要去显式调用。

然后后面就是配置路由了,路由集中管理了,和 springboot 注解配置的形式又有点不同。

最后 r.Run() 启动服务。

3. postman 接口测试

启动项目:

go run main.go

 1. 查询所有用户

 2. 删除用户

3. 更新用户

今天分享就到这里了,

我是此林,

关注我吧,带你看不一样的世界!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/77143.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

探索亮数据Web Unlocker API:让谷歌学术网页科研数据 “触手可及”

本文目录 一、引言二、Web Unlocker API 功能亮点三、Web Unlocker API 实战1.配置网页解锁器2.定位相关数据3.编写代码 四、Web Scraper API技术亮点 五、SERP API技术亮点 六、总结 一、引言 网页数据宛如一座蕴藏着无限价值的宝库,无论是企业洞察市场动态、制定…

SpringBoot整合POI实现Excel文件的导出与导入

使用 Apache POI 操作 Excel文件,系列文章: 《SpringBoot整合POI实现Excel文件的导出与导入》 《SpringMVC实现文件的上传与下载》 《C#使用NPOI导出Excel文件》 《NPOI使用手册》 1、Apache POI 的介绍 Apache POI 是一个基于 Java 的开源库,专为读写 Microsoft Office 格…

构建用户友好的记账体验 - LedgerX交互设计与性能优化实践

构建用户友好的记账体验 - LedgerX交互设计与性能优化实践 发布日期: 2025-04-16 引言 在财务管理应用领域,技术实力固然重要,但最终决定用户留存的往往是日常使用体验。本文作为LedgerX技术博客的第二篇,将深入探讨我们如何通过精心的交互…

如何用AI辅助软件产品原型设计及工具推荐

以下是针对软件产品原型设计的 AI辅助工具推荐,涵盖国内外主流工具,结合功能特点、优劣势及适用场景分析,并标注是否为国内软件及付费情况: 一、国内工具推荐 1. 墨刀AI(MockingBot AI) 特点:…

MySQL的MVCC机制详解

1. 什么是MVCC? MVCC(Multi-Version Concurrency Control,多版本并发控制)是数据库系统中用于实现并发控制的一种技术。它通过保存数据在某个时间点的快照来实现,使得在同一个数据行上可以同时存在多个版本&#xff0…

C语言数字图像处理---2.31统计滤波器

本文介绍空域滤波器中的一种:统计滤波器 [定义与算法] 统计滤波(Statistic Filter)定义:基于图像处理中的邻域统计方法,对邻域内的像素信息进行统计,如基于均值和方差的信息,用于平滑或去噪图像,同时保留边缘信息。 算法步骤如下: 统计滤波器的优点和缺点主要包…

计算机视觉相机模型与标定:如何让计算机“看懂”三维世界?

计算机视觉相机模型与标定:如何让计算机“看懂”三维世界? 一、前言二、相机模型基础​2.1 针孔相机模型​2.1.1 模型原理​2.1.2 代码示例​2.2 透视变换与相机内参​2.2.1 透视变换矩阵​2.2.2 内参矩阵的作用​2.3 相机外参​2.3.1 世界坐标系与相机坐标系的转换​2.3.2 外…

DeepSpeed ZeRO++:降低4倍网络通信,显著提高大模型及类ChatGPT模型训练效率

图1: DeepSpeed ZeRO 简介 大型 AI 模型正在改变数字世界。基于大型语言模型 (LLM)的 Turing-NLG、ChatGPT 和 GPT-4 等生成语言模型用途广泛,能够执行摘要、代码生成和翻译等任务。 同样,DALLE、Microsoft Designer 和 Bing Image Creator 等大型多模…

Seq2Seq - 编码器(Encoder)和解码器(Decoder)

本节实现一个简单的 Seq2Seq(Sequence to Sequence)模型 的编码器(Encoder)和解码器(Decoder)部分。 重点把握Seq2Seq 模型的整体工作流程 理解编码器(Encoder)和解码器&#xff08…

Spring Boot集成MinIO的详细步骤

1. 安装MinIO 使用Docker部署MinIO 拉取MinIO镜像: docker pull minio/minio 这将从Docker Hub中获取最新的MinIO镜像。 创建目录: mkdir -p /home/minio/config mkdir -p /home/minio/data 这些目录将用于持久化MinIO的数据和配置文件 创建MinIO…

基于PLC的停车场车位控制系统的设计

2.1 设计目标 本课题为基于PLC的停车场车位控制系统来设计,在此将功能确定如下: 针对8个车位的停车场进行设计将停车场分为入口处,车位处、以及出口处三个部分;每个车位都有指示灯指示当前位置是否空闲,方便司机查找空…

微服务即时通信系统---(四)框架学习

目录 ElasticSearch 介绍 安装 安装kibana ES客户端安装 头文件包含和编译时链接库 ES核心概念 索引(Index) 类型(Type) 字段(Field) 映射(mapping) 文档(document) ES对比MySQL Kibana访问ES测试 创建索引库 新增数据 查看并搜索数据 删除索引 ES…

除了 `task_type=“SEQ_CLS“`(序列分类),还有CAUSAL_LM,QUESTION_ANS

task_type="SEQ_CLS"是什么意思:QUESTION_ANS 我是qwen,不同模型是不一样的 SEQ_CLS, SEQ_2_SEQ_LM, CAUSAL_LM, TOKEN_CLS, QUESTION_ANS, FEATURE_EXTRACTION. task_type="SEQ_CLS" 通常用于自然语言处理(NLP)任务中,SEQ_CLS 是 Sequence Classif…

Android ViewPager使用预加载机制导致出现页面穿透问题

​ 缘由 在应用中使用ViewPager,并且设置预加载页面。结果出现了一些异常的现象。 我们有4个页面,分别是4个Fragment,暂且称为FragmentA、FragmentB、FragmentC、FragmentD,ViewPager在MainActivity中,切换时&#x…

apt3.0和apt2.0的区别

一,简单区别 更新方式 apt2.0:一次性更新所有内容,没有分阶段更新功能。apt3.0:引入分阶段更新功能,可分批推送更新包。 界面显示 apt2.0:界面简单,输出信息较为杂乱,没有彩色高亮和…

过电压保护器与传统的保护方式对比

过电压保护器主要用于保护电气设备免受大气过电压(如雷击)和操作过电压(开关动作等引发)的侵害。它通常由非线性电阻片等元件组成,利用其独特的伏安特性工作。正常电压下,保护器呈现高阻态,几乎…

机器学习(3)——决策树

文章目录 1. 决策树基本原理1.1. 什么是决策树?1.2. 决策树的基本构成:1.3. 核心思想 2. 决策树的构建过程2.1. 特征选择2.1.1. 信息增益(ID3)2.1.2. 基尼不纯度(CART)2.1.3. 均方误差(MSE&…

充电桩领域垂直行业大模型分布式推理与训练平台建设方案 - 慧知开源充电桩平台

没有任何广告! 充电桩领域垂直行业大模型分布式推理与训练平台建设方案 一、平台定位与核心价值 行业首个垂直化AI平台 专为充电桩运营场景设计的分布式大模型训练与推理基础设施,实现"算力-算法-场景"三位一体闭环管理。 核心价值主张&am…

NLP高频面试题(四十五)——PPO 算法在 RLHF 中的原理与实现详解

近端策略优化(Proximal Policy Optimization, PPO)算法是强化学习领域的一种新颖且高效的策略优化方法,在近年大规模语言模型的人类反馈强化学习(Reinforcement Learning with Human Feedback, RLHF)中发挥了关键作用。本文将以学术严谨的风格,详细阐述 PPO 算法的原理及…

C++指针和引用之区别(The Difference between C++Pointers and References)

面试题:C指针和引用有什么区 C指针和引用有什么区别? 在 C 中,指针和引用都是用来访问其他变量的值的方式,但它们之间存在一些重要的区别。了解这些区别有助于更好地理解和使用这两种工具。 01 指针 指针(Pointer…