概述
如果您没有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 main
import (
"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 main
import (
"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 main
import (
"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 main
import (
"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 []User
db.Find(&users)
fmt.Println(users)
}
06 修改数据
package main
import (
"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 []User
db.Find(&users)
fmt.Println(users)
}
07 删除数据
package main
import (
"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 []User
db.Find(&users)
fmt.Println(users)
}
08 zdpgo_gorm的介绍和使用
package main
import (
"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 []User
db.Find(&users)
fmt.Println(users)
}
09 事务的使用
package main
import (
"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).Error
if err != nil {
tx.Rollback()
panic(err)
}
tx.Commit()
var users []User
db.Find(&users)
fmt.Println(users)
}
11 封装和使用初始化和关闭MySQL的方法
package g
import (
"github.com/zhangdapeng520/zdpgo_gorm"
_ "github.com/zhangdapeng520/zdpgo_mysql"
"gorm_api_user2/model"
)
var GDB *zdpgo_gorm.DB
func initMySQL() {
var err error
GDB, 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 router
import "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 main
import (
"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 router
import (
"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.User
zdpgo_httprouter.GetJson(r, &user)
g.GDB.Create(&user)
zdpgo_httprouter.ResponseSuccess(w, user)
}
package router
import (
"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 router
import (
"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.User
g.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.User
g.GDB.Find(&user, "id=?", id)
zdpgo_httprouter.ResponseSuccess(w, user)
}
package router
import (
"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 router
import (
"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.User
zdpgo_httprouter.GetJson(r, &user)
g.GDB.Model(model.User{Id: id}).Update("name", user.Name, "age", user.Age)
zdpgo_httprouter.ResponseSuccess(w, nil)
}
package router
import (
"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 router
import (
"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 router
import (
"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私教~