那个网站做玉石最专业,大连做网站软件,wordpress文章美化插件,论文关键词简介
只作为快速入门、了解Go的GinGorm框架的demo#xff0c;不能作为企业级开发。 详细用法请看官网 《Gin官网》 《Gorm官网》
使用GoLand创建Go项目#xff08;默认modules#xff09;
go版本1.22.2 需要设置代理下载go相关软件包#xff0c;否则软件包可能无法下载。…简介
只作为快速入门、了解Go的GinGorm框架的demo不能作为企业级开发。 详细用法请看官网 《Gin官网》 《Gorm官网》
使用GoLand创建Go项目默认modules
go版本1.22.2 需要设置代理下载go相关软件包否则软件包可能无法下载。
https://goproxy.cn目录结构 go.mod就是管理相关软件的版本信息如果你学习过Java可以简单理解mod就是maven、gradle等构建工具
安装 Gin Gorm 软件包 控制台执行以下三条命令否则启动会报错。 gin web框架 gorm orm框架 gorm mysql 数据库驱动
go get -u github.com/gin-gonic/gin
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql创建mysql数据库 创建main.go文件
go有且仅有一个main函数这个是跟java不太一样的地方java是允许有多个main函数的。
//包的概念
package main//引入的包路径
import (fmtgithub.com/gin-gonic/gingorm.io/driver/mysqlgorm.io/gormnet/httppathtime
)//定义一个结构体
type UserInfo struct {gorm.Model //gorm模型默认包含 ID、CreatedAt、UpdatedAt、DeletedAt 4个变量Username string gorm:index form:username json:username binding:requiredPassword string form:password json:password binding:required
}// 自定义 gin 中间件 MyHandlerFunc
func MyHandlerFunc(invoke bool) gin.HandlerFunc {return func(c *gin.Context) {if invoke {fmt.Println(请求开始......)start : time.Now()//在请求上下文中设置值后续的处理函数可以获取到该值c.Set(token, 1)token, ok : c.Get(token)if !ok {c.JSON(http.StatusUnauthorized, gin.H{code: http.StatusUnauthorized,message: 未授权,})return}fmt.Printf(token %v\n, token)c.Next()//c.Abort()表示阻止代码继续往下执行//c.Abort()//计算请求耗时cost : time.Since(start)fmt.Println(请求耗时:, cost)fmt.Println(请求结束......)} else {c.Next()}}
}//main函数
func main() {//0.在控制台输入 go get -u github.com/gin-gonic/gin 安装 Gin 软件包//返回默认路由引擎r : gin.Default()//指定用户使用GET请求访问/hello并执行匿名函数返回JSON格式map[string]的数据//1.返回map一般用于临时返回不推荐r.GET(/map, func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{message: Hello World,})})/*2.返回结构体【推荐】类似java中的对象但是首字母必须大写否则无法进行序列化和反序列化以及灵活使用tag来对结构体进行定制化操作*/type Person struct {//后面写json:name表示如果以json返回则变量名使用nameName string json:nameMessage string json:messageAge int json:age}r.GET(/struct, func(c *gin.Context) {data : Person{Meta39, Java 学习 Go, 25}c.JSON(http.StatusOK, data)})//3.请求地址携带参数的请求【不推荐】主要使用c.Query访问localhost:8080/query?nameMeta39age25浏览器返回Meta39控制台输出age: 25r.GET(/query, func(c *gin.Context) {name : c.Query(name)age : c.Query(age)c.JSON(http.StatusOK, gin.H{name: name,})fmt.Printf(age: %s\n, age)})//4.获取URL路径参数【推荐】根据用户ID查询用户信息访问localhost:8080/user/1//relativePath也可以是/user/:id/:age多个组合r.GET(/user/:id, func(c *gin.Context) {id : c.Param(id)c.JSON(http.StatusOK, gin.H{id: id,name: Meta39,age: 25,sex: Man,})})//5.参数绑定ShouldBind【推荐】(访问localhost:8080/shouldBind在body {username: mata,password: 123456})r.POST(/shouldBind, func(c *gin.Context) {//声明UserInfo类型的变量uvar u UserInfo// 类似于 Spring RequestBody 注解err : c.ShouldBind(u)if err ! nil {c.JSON(http.StatusBadRequest, gin.H{error: err.Error(),})return}fmt.Printf(%v\n, u)c.JSON(http.StatusOK, gin.H{success: ok,})})//6.文件上传r.POST(/upload, func(c *gin.Context) {//从请求中读取文件f, err : c.FormFile(file)if err ! nil {c.JSON(http.StatusBadRequest, gin.H{error: err.Error(),})return}//将读取的文件保存到本地dst : path.Join(./, f.Filename)_ c.SaveUploadedFile(f, dst)c.JSON(http.StatusOK, gin.H{success: ok,})})//7.处理404r.NoRoute(func(c *gin.Context) {c.JSON(http.StatusNotFound, gin.H{code: 404,message: 404 Not Found,data: nil,})})//8.路由组【支持嵌套】类似SpringBoot里的RequestMappinguserGroup : r.Group(/users){//根据用户id查询用户userGroup.GET(/:id, func(c *gin.Context) {id : c.Param(id)c.JSON(http.StatusOK, gin.H{id: id,name: Meta39,})})//创建用户userGroup.POST(/, func(c *gin.Context) {var u UserInfoerr : c.ShouldBind(u)if err ! nil {c.JSON(http.StatusBadRequest, gin.H{error: err.Error(),})}fmt.Printf(创建用户%v\n, u)c.JSON(http.StatusOK, gin.H{success: ok,})})}//9.定义中间件一般放到路由组Group类似Java中的filter过滤器r.GET(/handlerFunc, MyHandlerFunc(true), func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{message: MyHandlerFunc,})})//10.在控制台输入 go get -u gorm.io/gorm 安装 gorm 软件包//11.在控制台输入 go get -u gorm.io/driver/mysql 安装 gorm mysql 数据库驱动软件包dsn : root:123456tcp(127.0.0.1:3306)/gorm?charsetutf8mb4parseTimeTruelocLocaldb, gormErr : gorm.Open(mysql.Open(dsn), gorm.Config{})if gormErr ! nil {panic(failed to connect database)}// 迁移 schema_ db.AutoMigrate(UserInfo{})var userInfo UserInfo// Createdb.Create(UserInfo{Username: Meta39, Password: 123456})// Readdb.First(userInfo, 1) // 根据整型主键查找db.First(userInfo, username ?, Meta39) // 查找 username 字段值为 Meta39 的记录// Update - 将 userInfo 的 Password 更新为 654321db.Model(userInfo).Update(Password, 654321)// Update - 更新多个字段db.Model(userInfo).Updates(UserInfo{Username: Meta, Password: 123}) // 仅更新非零值字段db.Model(userInfo).Updates(map[string]interface{}{Username: Meta1, Password: 234})// Delete - 删除 userInfo默认软删除即打上删除标志如在deleted_at填充时间表示这条数据已经被删除了//db.Delete(userInfo, 1)//永久删除//db.Unscoped().Delete(userInfo, 1)//启动服务不指定端口号则默认8080ginErr : r.Run(:8080)//启动异常处理并输出异常信息if ginErr ! nil {fmt.Printf(ginErr:%v\n, ginErr)return}}控制台执行
go run .\main.go打开浏览器访问localhost:8080/map会输出JSON格式的Hello World 数据库会有一条id 1的记录