Go语言加Vue3零基础入门全栈班11 Go语言+gorm用户管理系统实战 2024年08月03日 课程笔记
概述
如果您没有Golang的基础,应该学习如下前置课程。
- Golang零基础入门
- Golang面向对象编程
- Go Web 基础
- Go语言开发REST API接口_20240728
- Go语言操作MySQL开发用户管理系统API教程_20240729
- Redis零基础快速入门_20231227
- Go+Redis开发用户管理系统API实战_20240730
- MongoDB快速入门_20240411
- Go语言+MongoDB用户管理系统实战_20240730
- Go语言+gRPC用户微服务项目实战_20240730
基础不好的同学每节课的代码最好配合视频进行阅读和学习,如果基础比较扎实,则阅读本教程巩固一下相关知识点即可,遇到不会的知识点再看视频。
课程特色
本教程录制于2024年8月3日,使用Go1.22版本,基于Goland2024进行开发,采用的技术栈比较新。
每节课控制在十分钟以内,课时精简,每节课都是一个独立的知识点,如果有遗忘,完全可以当做字典来查询,绝不浪费大家的时间。
整个课程从如何连接MySQL讲起,讲解gorm的增删改查常见操作,然后结合REST API接口开发的知识,开发一个用户管理系统的后端API服务,层层递进,学习路径平缓。
Golang是当前国内越来越多的企业正在全面转的一门系统级别的高性能的编程语言,比C语言写法更加的简单,比Python性能更加的好,是新时代的C语言,建议每个程序员都掌握!
视频课程
最近发现越来越多的公司在用Golang了,所以精心整理了一套视频教程给大家,这个是其中的第11部,后续还会有很多。
视频已经录制完成,完整目录截图如下:

本套课程的特色是每节课都是一个核心知识点,每个视频控制在十分钟左右,精简不废话,拒绝浪费大家的时间。
课程目录
- 01 概述
- 02 连接MySQL数据库
- 03 创建表
- 04 新增数据
- 05 查询数据
- 06 修改数据
- 07 删除数据
- 08 zdpgo_gorm的介绍和使用
- 09 事务的使用
- 10 搭建项目的基本结构
- 11 封装和使用初始化和关闭MySQL的方法
- 12 创建和启动服务
- 13 实现新增用户的接口并进行测试
- 14 实现查询所有用户的接口并进行测试
- 15 实现根据ID查询用户的接口并进行测试
- 16 实现根据ID修改用户的接口并进行测试
- 17 实现根据ID删除用户的接口并进行测试
- 18 总结
完整代码
02 连接MySQL数据库
package mainimport ("github.com/jinzhu/gorm"_ "github.com/jinzhu/gorm/dialects/mysql"
)func main() {db, err := gorm.Open("mysql","root:root@tcp(127.0.0.1:3306)/test?charset=utf8&parseTime=True&loc=Local",)if err != nil {panic(err)}defer db.Close()db.DB().SetMaxIdleConns(10)db.DB().SetMaxOpenConns(100)
}
03 创建表
package mainimport ("github.com/jinzhu/gorm"_ "github.com/jinzhu/gorm/dialects/mysql"
)type User struct {Id int `json:"id"`Name string `json:"name"`Age int `json:"age"`
}func main() {db, err := gorm.Open("mysql","root:root@tcp(127.0.0.1:3306)/test?charset=utf8&parseTime=True&loc=Local",)if err != nil {panic(err)}defer db.Close()db.DB().SetMaxIdleConns(10)db.DB().SetMaxOpenConns(100)db.AutoMigrate(&User{})
}
04 新增数据
package mainimport ("github.com/jinzhu/gorm"_ "github.com/jinzhu/gorm/dialects/mysql"
)type User struct {Id int `json:"id"`Name string `json:"name"`Age int `json:"age"`
}func main() {db, err := gorm.Open("mysql","root:root@tcp(127.0.0.1:3306)/test?charset=utf8&parseTime=True&loc=Local",)if err != nil {panic(err)}defer db.Close()db.DB().SetMaxIdleConns(10)db.DB().SetMaxOpenConns(100)db.AutoMigrate(&User{})user := User{11, "张三", 33}db.Create(&user)
}
05 查询数据
package mainimport ("fmt""github.com/jinzhu/gorm"_ "github.com/jinzhu/gorm/dialects/mysql"
)type User struct {Id int `json:"id"`Name string `json:"name"`Age int `json:"age"`
}func main() {db, err := gorm.Open("mysql","root:root@tcp(127.0.0.1:3306)/test?charset=utf8&parseTime=True&loc=Local",)if err != nil {panic(err)}defer db.Close()db.DB().SetMaxIdleConns(10)db.DB().SetMaxOpenConns(100)db.AutoMigrate(&User{})var users []Userdb.Find(&users)fmt.Println(users)
}
06 修改数据
package mainimport ("fmt""github.com/jinzhu/gorm"_ "github.com/jinzhu/gorm/dialects/mysql"
)type User struct {Id int `json:"id"`Name string `json:"name"`Age int `json:"age"`
}func main() {db, err := gorm.Open("mysql","root:root@tcp(127.0.0.1:3306)/test?charset=utf8&parseTime=True&loc=Local",)if err != nil {panic(err)}defer db.Close()db.DB().SetMaxIdleConns(10)db.DB().SetMaxOpenConns(100)db.AutoMigrate(&User{})db.Model(&User{Id: 11}).Update("name", "李四333")var users []Userdb.Find(&users)fmt.Println(users)
}
07 删除数据
package mainimport ("fmt""github.com/jinzhu/gorm"_ "github.com/jinzhu/gorm/dialects/mysql"
)type User struct {Id int `json:"id"`Name string `json:"name"`Age int `json:"age"`
}func main() {db, err := gorm.Open("mysql","root:root@tcp(127.0.0.1:3306)/test?charset=utf8&parseTime=True&loc=Local",)if err != nil {panic(err)}defer db.Close()db.DB().SetMaxIdleConns(10)db.DB().SetMaxOpenConns(100)db.AutoMigrate(&User{})db.Delete(&User{Id: 11})var users []Userdb.Find(&users)fmt.Println(users)
}
08 zdpgo_gorm的介绍和使用
package mainimport ("fmt""github.com/zhangdapeng520/zdpgo_gorm"_ "github.com/zhangdapeng520/zdpgo_mysql"
)type User struct {Id int `json:"id"`Name string `json:"name"`Age int `json:"age"`
}func main() {db, err := zdpgo_gorm.Open("mysql","root:root@tcp(127.0.0.1:3306)/test?charset=utf8&parseTime=True&loc=Local",)if err != nil {panic(err)}defer db.Close()db.DB().SetMaxIdleConns(10)db.DB().SetMaxOpenConns(100)db.AutoMigrate(&User{})var users []Userdb.Find(&users)fmt.Println(users)
}
09 事务的使用
package mainimport ("fmt""github.com/zhangdapeng520/zdpgo_gorm"_ "github.com/zhangdapeng520/zdpgo_mysql"
)type User struct {Id int `json:"id"`Name string `json:"name"`Age int `json:"age"`
}func main() {db, err := zdpgo_gorm.Open("mysql","root:root@tcp(127.0.0.1:3306)/test?charset=utf8&parseTime=True&loc=Local",)if err != nil {panic(err)}defer db.Close()db.DB().SetMaxIdleConns(10)db.DB().SetMaxOpenConns(100)db.AutoMigrate(&User{})tx := db.Begin()u := User{Name: "赵六", Age: 18}err = tx.Create(&u).Errorif err != nil {tx.Rollback()panic(err)}tx.Commit()var users []Userdb.Find(&users)fmt.Println(users)
}
11 封装和使用初始化和关闭MySQL的方法
package gimport ("github.com/zhangdapeng520/zdpgo_gorm"_ "github.com/zhangdapeng520/zdpgo_mysql""gorm_api_user2/model"
)var GDB *zdpgo_gorm.DBfunc initMySQL() {var err errorGDB, err = zdpgo_gorm.Open("mysql","root:root@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local",)if err != nil {panic(err)}GDB.DB().SetMaxIdleConns(10)GDB.DB().SetMaxOpenConns(100)GDB.AutoMigrate(&model.User{})
}func closeMySQL() {GDB.Close()
}
12 创建和启动服务
package routerimport "github.com/zhangdapeng520/zdpgo_httprouter"func InitRouter() *zdpgo_httprouter.Router {router := zdpgo_httprouter.New()router.POST("/user", userAdd)router.GET("/user", userGetAll)router.GET("/user/:id", userGet)router.PUT("/user/:id", userUpdate)router.DELETE("/user/:id", userDelete)return router
}
package mainimport ("gorm_api_user2/g""gorm_api_user2/router""net/http""time"
)func main() {g.InitGlobal()defer g.CloseGlobal()server := &http.Server{Addr: ":8888",Handler: router.InitRouter(),ReadTimeout: 5 * time.Second,WriteTimeout: 5 * time.Second,}server.ListenAndServe()
}
13 实现新增用户的接口并进行测试
package routerimport ("github.com/zhangdapeng520/zdpgo_httprouter""gorm_api_user2/g""gorm_api_user2/model""net/http"
)func userAdd(w http.ResponseWriter, r *http.Request, _ zdpgo_httprouter.Params) {var user model.Userzdpgo_httprouter.GetJson(r, &user)g.GDB.Create(&user)zdpgo_httprouter.ResponseSuccess(w, user)
}
package routerimport ("github.com/zhangdapeng520/zdpgo_httprouter""io""os""testing"
)func TestUserAdd(t *testing.T) {targetUrl := "http://127.0.0.1:8888/user"data := map[string]interface{}{"name": "王五","age": 30,}resp, err := zdpgo_httprouter.SendJson("POST", targetUrl, data)if err != nil {t.Error(err)}io.Copy(os.Stdout, resp.Body)
}
14 实现查询所有用户的接口并进行测试
package routerimport ("github.com/zhangdapeng520/zdpgo_httprouter""gorm_api_user2/g""gorm_api_user2/model""net/http""strconv"
)func userGetAll(w http.ResponseWriter, r *http.Request, _ zdpgo_httprouter.Params) {var users []model.Userg.GDB.Find(&users)zdpgo_httprouter.ResponseSuccess(w, users)
}func userGet(w http.ResponseWriter, r *http.Request, ps zdpgo_httprouter.Params) {idStr := ps.ByName("id")id, _ := strconv.Atoi(idStr)var user model.Userg.GDB.Find(&user, "id=?", id)zdpgo_httprouter.ResponseSuccess(w, user)
}
package routerimport ("io""net/http""os""testing"
)func TestUserGetAll(t *testing.T) {targetUrl := "http://127.0.0.1:8888/user"resp, err := http.Get(targetUrl)if err != nil {t.Error(err)}io.Copy(os.Stdout, resp.Body)
}func TestUserGet(t *testing.T) {targetUrl := "http://127.0.0.1:8888/user/4"resp, err := http.Get(targetUrl)if err != nil {t.Error(err)}io.Copy(os.Stdout, resp.Body)
}
16 实现根据ID修改用户的接口并进行测试
package routerimport ("github.com/zhangdapeng520/zdpgo_httprouter""gorm_api_user2/g""gorm_api_user2/model""net/http""strconv"
)func userUpdate(w http.ResponseWriter, r *http.Request, ps zdpgo_httprouter.Params) {idStr := ps.ByName("id")id, _ := strconv.Atoi(idStr)var user model.Userzdpgo_httprouter.GetJson(r, &user)g.GDB.Model(model.User{Id: id}).Update("name", user.Name, "age", user.Age)zdpgo_httprouter.ResponseSuccess(w, nil)
}
package routerimport ("github.com/zhangdapeng520/zdpgo_httprouter""io""os""testing"
)func TestUserUpdate(t *testing.T) {targetUrl := "http://127.0.0.1:8888/user/4"data := map[string]interface{}{"name": "李四333","age": 30,}resp, err := zdpgo_httprouter.SendJson("PUT", targetUrl, data)if err != nil {t.Error(err)}io.Copy(os.Stdout, resp.Body)
}
17 实现根据ID删除用户的接口并进行测试
package routerimport ("github.com/zhangdapeng520/zdpgo_httprouter""gorm_api_user2/g""gorm_api_user2/model""net/http""strconv"
)func userDelete(w http.ResponseWriter, r *http.Request, ps zdpgo_httprouter.Params) {idStr := ps.ByName("id")id, _ := strconv.Atoi(idStr)g.GDB.Delete(&model.User{Id: id})zdpgo_httprouter.ResponseSuccess(w, nil)
}
package routerimport ("github.com/zhangdapeng520/zdpgo_httprouter""io""os""testing"
)func TestUserDelete(t *testing.T) {targetUrl := "http://127.0.0.1:8888/user/4"data := map[string]interface{}{}resp, err := zdpgo_httprouter.SendJson("DELETE", targetUrl, data)if err != nil {t.Error(err)}io.Copy(os.Stdout, resp.Body)
}
总结
整个课程从如何连接MySQL讲起,讲解gorm的增删改查常见操作,然后结合REST API接口开发的知识,开发一个用户管理系统的后端API服务,层层递进,学习路径平缓。
通过本套课程,能帮你入门Go语言加gorm框架开发后端REST API接口服务的技术。
如果您需要完整的源码,打赏20元即可。
人生苦短,我用PyGo,我是您身边的Python私教~
相关文章:
Go语言加Vue3零基础入门全栈班11 Go语言+gorm用户管理系统实战 2024年08月03日 课程笔记
概述 如果您没有Golang的基础,应该学习如下前置课程。 Golang零基础入门Golang面向对象编程Go Web 基础Go语言开发REST API接口_20240728Go语言操作MySQL开发用户管理系统API教程_20240729Redis零基础快速入门_20231227GoRedis开发用户管理系统API实战_20240730Mo…...
【设计模式】代理模式详解
1.简介 代理模式是常用的Java设计模式,该模式的特点是代理类与委托类共享相同的接口。代理类主要负责预处理消息、过滤消息、将消息转发给委托类,并在事后处理消息等。代理类与委托类之间通常存在关联关系,一个代理类对象与一个委托类对象关…...
Python变量和简单的数据类型
1、变量 massageHello python world! print(massage) massageHello world print(massage) 运行这个代码发现,同一个变量出现两个不同的结果 Hello python world! Hello world 在程序中,可随时修改变量的值&…...
切比雪夫距离
切比雪夫距离(Chebyshev Distance),又称棋盘距离或最大值距离,是一种用于测量两个点之间距离的度量方法。在二维平面上,切比雪夫距离定义为两个点之间的最大坐标差值。其公式如下: DChebyshevmax(∣x2−…...
计算机基础(Windows 10+Office 2016)教程 —— 第4章 计算机网络与Internet(下)
第4章 计算机网络与Internet 4.4 局域网4.4.1 局域网概述4.4.2 以太网4.4.3 令牌环网4.4.4 无线局域网 4.5 Internet4.5.1 Internet 概述4.5.2 Internet 的基本概念4.5.3 Internet 的接入4.5.4 万维网 4.6 Internet的应用4.6.1 电子邮件4.6.2 文件传输4.6.3 搜索引擎 4.4 局域网…...
机器学习用Python还是R?哪个更好一些?
选择使用Python还是R来进行机器学习取决于多个因素,包括个人偏好、项目需求以及可用的资源。这里我可以简要比较一下它们的优缺点: Python的优势: 通用性和灵活性: Python是一种通用编程语言,可以用于多种用途&#…...
4个自定义倒计时
<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><title>4个自定义倒计时</title><style>* {margin: 0;padding: 0;box-sizing: border-box;user-select: none;body {background: #0b1b2c;}}hea…...
linux系统编程中Shell脚本配置,及linux脚本中的man test
Shell脚本配置是指在脚本中设置各种参数、选项和环境,以确保脚本能够根据预期的需求和环境执行。配置可以包括变量设置、环境变量、命令选项和错误处理等。 1. 脚本开头的配置 Shebang 第一行通常是shebang,它告诉系统使用哪个解释器来执行脚本。例如…...
Win7虚拟机分享(已安装VMware Tools)
前言 之前写过VMware安装Win7并安装VMware tools的博客,但操作仍显繁琐。后来发现可以直接分享已经配置好的虚拟机,所有软件都是安装好的,解压即用。 一. VMware Win7虚拟机配置 已完成的配置和安装的软件 专业版Win7系统(已永久激活)VMware…...
CANOpen EMCY紧急报文介绍
什么是CANOpen紧急报文 CANOpen中的Emcy紧急报文用于当设备出现故障或警告时,向其它节点报告故障或警告使用的。如设备某个设备出现过压或过流时,就可以发送紧急报文。 紧急报文的格式 错误代码:是0x1003索引预定义错误字段的内容ÿ…...
JAVA项目
目录 一、前言 二、技术介绍 三、项目实现流程 四、论文流程参考 五、核心代码截图 专注于大学生实战开发、讲解和毕业答疑等辅导,获取源码后台 一、前言 在数字化音乐时代,个性化推荐已成为提升用户体验、促进音乐消费的重要手段。为此࿰…...
️ LangChain +Streamlit+ Llama :将对话式人工智能引入您的本地设备(下篇)
引言:种下一棵树最好的时间是十年前,其次是现在 书接上回:将对话式人工智能引入您的本地设备成为可能CSDNhttps://mp.csdn.net/mp_blog/creation/editor/140865426 目的:在这个大模型横行的时候,我们常用电脑如何开展大模型的工作…...
Kafka实战(Scala操作)
Kafka基础讲解部分 Kafka基础讲解部分 Kafka实战(Scala操作) 1、引入依赖 版本: <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.report…...
Android Framework 之WMS详解
1.WMS说的就是 WindowManagerService:负责为Activity对应的窗口分配Surface,管理Surface的显示顺序以及位置尺寸,控制窗口动画 。 它是Android系统中为各个客户端即每个app来提供这样的服务的一个类。 在Android系统中在systemServer 进程和各…...
opencv-图像仿射变换
仿射变换设计图像位置角度的变化,是深度学习预处理中常用的功能。仿射变换就是对图像的平移缩放旋转翻转操作的组合 如下图,对图中点1,2,3与图二中三个点一一映射,仍然形成三角形,但形状已经发生改变,通过这两组三点求…...
算法的基本概念
一、算法的基本概念思维导图 二、什么是算法: 1.我们知道数据结构就是将我门现实的世界中的问题数据化,存入计算机中,并实现对数据结构的一些基本操作。 2.算法就是如何处理这些存入计算机中的信息,以求高效的解决实际问题。 3…...
124. Go Template应用实例:用代码生成代码
文章目录 生成器模式生成器代码生成 本文用生成器模式作为例子,来演示如何用代码生成代码。 生成器模式 熟悉 Java 开发的同学都知道,lombok 有一个著名的注解 Builder ,只要加在类上面,就可以自动生成 Builder 模式的代码。如下…...
【AI实践】阿里云方言文本转语音TTS
最近要做一些普通话和方言demo 找一个免费工具 免费在线文字转语音工具 | edge-tts 在线体验 (bingal.com) 还有一些方言在阿里云上找了下,基于官方demo改了一下 阿里云语音合成接口说明_智能语音交互(ISI)-阿里云帮助中心 (aliyun.com) 如何下载安装、使用语音…...
java 之 各类日期格式转换
一、前言 大家在开发过程中必不可少得和日期打交道,对接别的系统时,时间日期格式不一致,每次都要转换! 从 Java1 到 Java8 将近 20 年,再加上 Java8 的普及时间、各种历史 API 兼容过渡时间。我们很多时候需要在旧时间 API 与新时…...
Nvidia黄仁勋对话Meta扎克伯格:AI和下一代计算平台的未来 | SIGGRAPH 2024对谈回顾
在今年的SIGGRAPH图形大会上,Nvidia创始人兼CEO黄仁勋与Meta创始人马克扎克伯格进行了一场长达60分钟的对谈。这场对话不仅讨论了AI的未来发展和Meta的开源哲学,还发布了不少新产品,并深入探讨了下一代计算平台的可能性。 引言 人工智能的发…...
大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...
《Docker》架构
文章目录 架构模式单机架构应用数据分离架构应用服务器集群架构读写分离/主从分离架构冷热分离架构垂直分库架构微服务架构容器编排架构什么是容器,docker,镜像,k8s 架构模式 单机架构 单机架构其实就是应用服务器和单机服务器都部署在同一…...
