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私教~

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

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

相关文章

Linux-入门-02

上节我们讲了如何安装虚拟机,本节课讲一些linux的常用命令,首先我们需要做一些配置,我们的centos的镜像是最小版安装,里面什么也没有,所以我们的linux是不能进行联网的,接下来我们就来一步一步联网 1、配置网络 首先我们需要先使用命令查看ip地址,linux中一切皆文件,只能使用命…

数据结构——排序(1):插入排序

目录 一、排序的概念 二、排列的运用 三、常见的排序算法 四、插入排序 1.直接插入排序 (1)思路 (2)过程图示 (3)代码实现 (4)代码解释 (5)特性 2.希尔排序 (1…

CSS技巧专栏:一日一例 20-纯CSS实现点击会凹陷的按钮

本例图片 案例分析 其实这个按钮非常的简单啊,主要就是利用了box-shadow的inset。 布局代码 <button class="base">凹下的按钮</button> 基础样式 :root{--main-bg-color: #dcdcdc; /* 将页面背景色调整为浅灰色 */--color:#000;--hover-color:#99…

LLM - GQA 之 Group Query Attention 论文与源码精读

目录 Abstract 1.Introduction 2.Method 2.1 UpTraining 2.2 Grouped-query attention 3.Experiments 3.1 Experimental setup 3.2 Main Results 3.3 Ablations 4.Related Work 5.Conclustion 6.Code 6.1 repeat_kv 6.2 Attention Arg Init 6.3 Attention Mat I…

IT服务质量管理攻略(至简)

质量管理、风险管理和信息安全管理是IT服务监督管理的重要内容&#xff0c;三者之间相对独立。IT服务质量管理是通过制订质量方针、质量目标和质量计划&#xff0c;实施质量控制、质量保证和质量改进活动&#xff0c;确保IT服务满足服务级别协议的要求&#xff0c;最终获得用户…

openvidu私有化部署

openvidu私有化部署 简介 OpenVidu 是一个允许您实施实时应用程序的平台。您可以从头开始构建全新的 OpenVidu 应用程序&#xff0c;但将 OpenVidu 集成到您现有的应用程序中也非常容易。 OpenVidu 基于 WebRTC 技术&#xff0c;允许开发您可以想象的任何类型的用例&#xf…

[算法]第一集 递归(未完待续)

递归啊递归&#xff0c;说简单简单&#xff0c;说难难。 首先我们要知道 一、什么是递归&#xff1f; 我们再C语言和数据结构里都用了不少递归&#xff0c;这里就不多详细介绍。 递归简单来说就是函数自己调用自己的情况 二、为什么要用递归呢&#xff1f; 本质来说其实就…

【WRF安装第四期(Ubuntu)】搭建WRF编译所需系统-WRF和WPS模型的安装

WRF安装第四期&#xff1a;搭建WRF编译所需系统-WRF和WPS模型的安装 1 WRF的编译安装&#xff08;Building WRF&#xff09;1.1 进入Build_WRF文件夹1.2 下载WRFV4.01.3 解压WRF安装包1.4 安装WRF选择#1&#xff1a;32选择#2&#xff1a;33选择#3&#xff1a;34 1.5 检查WRF是否…

Linux 中的信号处理

Linux 中的信号处理是操作系统中非常重要的一个概念&#xff0c;通过信号处理&#xff0c;进程之间可以进行通信、协调以及实现一些重要的功能。本文将从信号的概念、类型、生成、传递、处理、以及常见的信号处理函数等方面展开讨论&#xff0c;以帮助读者更深入地了解 Linux 中…

【机器学习】BP神经网络中的链式法则

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 BP神经网络中的链式法则1. 引言2. 链式法则基础2.1 什么是链式法则&#xff1f;…

29.Labview界面设计(下篇) --- 自定义控件库、界面布局与外观设计

摘要&#xff1a; 题主在上一篇文章中向大家讲解了前面板逻辑框架及结构的搭建和控件的类型介绍&#xff0c;那么本章主要围绕前面板的控件布局以及控件的自定义类型和背景等外观优化项中来讲解。 本篇文章讲解界面设计的下篇内容&#xff0c;上篇内容链接大家可以直接点击链接…

国家统计局中国主要城市面板数据(1990-2023年)

数据说明&#xff1a;数据来源于国家统计局&#xff0c;指标包含&#xff1a;城市、年份、第三产业增加值、第一产业增加值 地区生产总值、第二产业增加值、年末户籍人口、城镇非私营单位在岗职工平均工资 房地产开发投资额、房地产开发住宅投资额、房地产开发办公楼投资额、房…

Linux C 程序 【03】线程栈空间

1.开发背景 上一个篇章创建了线程&#xff0c;参考 FreeRTOS&#xff0c;每个线程都是有自己的内存空间&#xff0c;Linux上面也是一样的&#xff0c;这个篇章主要描述线程栈空间的设置。 2.开发需求 设计实验&#xff1a; 1&#xff09;创建线程&#xff0c;并配置线程内存大…

培训第二十二天(mysql数据库主从搭建)

上午 1、为mysql添加开机启动chkconfig [rootmysql1 ~]# chkconfig --list //列出系统服务在不同运行级别下的启动状态注&#xff1a;该输出结果只显示 SysV 服务&#xff0c;并不包含原生 systemd 服务。SysV 配置数据可能被原生 systemd 配置覆盖。 要列出 systemd 服务…

IEEE报告解读:存储技术发展趋势分析

1.引言 随着数据科学、物联网&#xff08;IoT&#xff09;和永久存储需求的快速增长&#xff0c;对大规模数据存储的需求正在迅速增加。存储技术的发展趋势直接关系到数据的可靠性和经济性。本文将根据IEEE最新发布的《2023年国际器件与系统路线图》&#xff0c;深入探讨各种存…

AnyGPT: Unified Multimodal LLM with Discrete Sequence Modeling

发表时间&#xff1a;arXiv 2024年2月26日 论文链接&#xff1a;https://arxiv.org/pdf/2402.12226 作者单位&#xff1a; Fudan University Motivation&#xff1a; LLM 在理解和生成人类语言方面表现出非凡的能力。但是&#xff0c;LLM 的能力仅限于针对文本的处理。而现…

详解Xilinx FPGA高速串行收发器GTX/GTP(2)--什么是GTX?

文章总目录点这里:《FPGA接口与协议》专栏的说明与导航 GTX本质上是基于SerDes技术的高速串行收发器,它是FPGA内部的底层电路,也叫做Gigabit Transceiver(吉比特收发器,简称为GT)。其中A7系列使用的GT叫GTP,K7系列使用的GT叫GTX,V7系列使用的GT叫GTH和GTZ,它们…

循环神经网络和自然语言处理一

目录 一.分词 1.分词工具 2.分词的方法 3.N-gram表示方法 二.向量化 1.one-hot编码 2.word embedding 3.word embedding API 4.数据形状改变 既然是自然语言&#xff0c;那么就有字&#xff0c;词&#xff0c;句了 一.分词 1.分词工具 tokenization&#xff0c;jie…

【数据结构】二叉搜索树(Java + 链表实现)

Hi~&#xff01;这里是奋斗的明志&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f331;&#x1f331;个人主页&#xff1a;奋斗的明志 &#x1f331;&#x1f331;所属专栏&#xff1a;数据结构、LeetCode专栏 &#x1f4da;本系…

【DOCKER】显示带UI的软件

1. Linux 1.1 宿主机开放X server权限 xhost 1.2 启动容器 docker run -it --rm --privilegedtrue --useru20 --workdir/home/u20 \ -e DISPLAYhost.docker.internal:0 u20:dev1.3 测试 # 安装测试软件 sudo apt-get -y install x11-apps# 显示测试程序 xclock2. Windows …