这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天
队友打算大项目用 Gin 框架来写,所以稍微学习了一下 Gin 框架。
Gin 框架的安装
安装 Gin 框架的时候踩了几个坑,开始的时候没有设置好 GOPATH,下载安装没有权限,另外就是没设置好代理,导致在 GoLand 里面没法同步需要的代码。这两个设置好应该问题不大。
设置 GOPATH,我用的是 WSL2,在 /etc/profile 文件加了下面几行,ephmeral 是用户名
export GOPATH=/home/ephmeral/go
export GOROOT=/usr/local/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
添加好之后,source /etc/profile 就生效了。
代理我用的是 七牛云 - Goproxy.cn,打开你的终端并执行:
$ go env -w GO111MODULE=on
$ go env -w GOPROXY=https://goproxy.cn,direct
然后就可以下载安装 Gin 框架:
$ go get -u github.com/gin-gonic/gin
将 Gin 引入到代码中:
import "github.com/gin-gonic/gin"
Gin 框架简单示例
下面简单创建了由 Gin 搭建的服务器:
package main
import "github.com/gin-gonic/gin"
func main() {
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
})
r.Run() // 监听并在 0.0.0.0:8080 上启动服务
}
运行后在浏览器输入 127.0.0.1:8080/ping 就会显示对应的 JSON 格式的数据
Gin 路由
Gin 路由就是在 Gin 框架中把请求的 URL 地址与处理请求的代码进行绑定。
普通路由
r.GET("/index", func(c *gin.Context) {...})
r.GET("/login", func(c *gin.Context) {...})
r.POST("/login", func(c *gin.Context) {...})
路由组
我们可以将拥有共同 URL 前缀的路由划分为一个路由组。习惯性一对 {} 包裹同组的路由,这只是为了看着清晰,你用不用 {} 包裹功能上没什么区别。
func main() {
r := gin.Default()
userGroup := r.Group("/user")
{
userGroup.GET("/index", func(c *gin.Context) {...})
userGroup.GET("/login", func(c *gin.Context) {...})
userGroup.POST("/login", func(c *gin.Context) {...})
}
shopGroup := r.Group("/shop")
{
shopGroup.GET("/index", func(c *gin.Context) {...})
shopGroup.GET("/cart", func(c *gin.Context) {...})
shopGroup.POST("/checkout", func(c *gin.Context) {...})
}
r.Run()
}
路由组也是支持嵌套的,例如:
shopGroup := r.Group("/shop")
{
shopGroup.GET("/index", func(c *gin.Context) {...})
shopGroup.GET("/cart", func(c *gin.Context) {...})
shopGroup.POST("/checkout", func(c *gin.Context) {...})
// 嵌套路由组
xx := shopGroup.Group("xx")
xx.GET("/oo", func(c *gin.Context) {...})
}
Gin 注册中间件
大项目不涉及 HTML 渲染等,所以我主要看了下 Gin 中间件的使用方法,看了七米老师的课程:lesson18中间件_哔哩哔哩_bilibili
Gin 框架允许开发者在处理请求的过程中,加入用户自己的钩子(Hook)函数。这个钩子函数就叫中间件,中间件适合处理一些公共的业务逻辑,比如登录认证、权限校验、数据分页、记录日志、耗时统计等。
Gin 的中间件必须是一个 gin.HandlerFunc 类型。 gin.HandlerFunc 在 Gin 中定义为一个函数对象,其实就是参数只有 Contex 的一个函数,可以看下面的定义:
// HandlerFunc defines the handler used by gin middleware as return value.type HandlerFunc func(*Context)
知道了中间件的类型,下面就创建一个简单的中间件,indexHandle 返回了一个 JSON 数据,其中 msg 设置为了 hello world:
package main
import (
"fmt"
"github.com/gin-gonic/gin" "net/http")
func indexHandle(c *gin.Context) {
fmt.Println("index...")
c.JSON(http.StatusOK, gin.H{
"msg": "hello world",
})
}
func main() {
r := gin.Default() // 默认使用了Logger() 和 Recovery() 中间件
r.GET("/index", indexHandle)
r.Run()
}
运行之后浏览器打开 http://localhost:8080/index 就可以看见对应的 JSON 的消息。
除此之外还能给多个路由注册中间件,全局中间件以及中间件之后进行跨域请求等等,这里就不多做介绍,详细还是看七米老师的博客以及 Gin 中文文档。