Go gin 框架学习笔记
大约 3 分钟
gin框架学习笔记
提示
说明:下面内容中的所有 ctx 均指 gin 框架中的上下文
一、安装
下载安装gin
go get -u github.com/gin-gonic/gin
注意
如果下载不了记得查看一下是否配置了代理:https://goproxy.cn/
二、第一个简单的例子
package main
import "github.com/gin-gonic/gin"
func main() {
engine := gin.Default()
engine.GET("/hello", func(ctx *gin.Context) {
ctx.JSON(200, gin.H{
"message": "hello word",
})
})
engine.Run(":8000")
}
三、加载静态资源
3.1 加载favicon
import "github.com/thinkerou/favicon"
engine := gin.Default()
engine.Use(favicon.New("favicon.icon"))
3.2 加载html
engine := gin.Default()
// 全局加载html文件
engine.LoadHTMLGlob("static/*")
// 渲染页面
engine.GET("/index", func(ctx *gin.Context) {
// 1.状态码 2.页面名称 3.数据
ctx.HTML(http.StatusOK, "index.html", gin.H{"msg": "你好"})
})
获取后台传过来的msg

3.3 加载资源文件(css、js)
// 一个是相对目录 一个是跟目录;然后只需在对应的HTML中加载资源文件即可
engine.Static("/static", "./")
四、请求
4.1 获取请求参数
1) RESTful API 请求
// eg: /v1/user/:name
name := ctx.Param("name")
2) GET请求
// eg: /v1/user?name=zhangsan&age=18
name := ctx.Query("name")
age := ctx.Query("age")
3)POST请求
json数据
// 方法一
rec := make(map[string]interface{}) // 最好是结构体
err := ctx.ShouldBindJSON(&rec)
// 方法二
rec := make(map[string]interface{}) // 最好是结构体
datas, err := ctx.GetRawData()
json.Unmarshal(datas, &rec)
表单
name := ctx.PostForm("name")
五、验证
参考:https://www.liwenzhou.com/posts/Go/validator_usages/
六、路由
6.1 普通路由
engine := gin.Default()
engine.GET("/get", func1)
engine.POST("/post", func2)
engine.PUT("/put", func3)
engine.PATCH("/patch", func4)
engine.DELETE("/delete", func5)
6.2 空路由
engine.NoRoute(func(ctx *gin.Context) {
ctx.HTML(http.StatusNotFound, "404.html", "")
})
6.3 路由组
group := engine.Group("/v1")
{
group.GET("user", func1)
group.POST("user", func2)
}
七、中间件
说明
当使用gin.Default()时默认已经绑定了2个中间件Logger 和 Recovery
gin的中间件使用非常简单通过Use方法进行设置
func (engine *Engine) Use(middleware ...HandlerFunc) IRoutes
通过代码可以看出其实gin的中间件就是定义了一个HandlerFunc
// 通过一下两个方法来控制中间件
ctx.Next() // 放行
ctx.Abort() // 阻止
7.1 常用的中间件
1)压缩返回
eng.Use(gzip.Gzip(gzip.DefaultCompression))
2)http重定向https
func TlsHandler() gin.HandlerFunc {
return func(ctx *gin.Context) {
secureMiddleware := secure.New(secure.Options{
SSLRedirect: true,
SSLHost: "127.0.0.1:443", // https跳转地址,支持域名
})
err := secureMiddleware.Process(ctx.Writer, ctx.Request)
if err != nil {
return
}
ctx.Next()
}
}
3)代理静态资源
eng.Use(static.ServeRoot("/static", "./dist"))
八、返回
// 常用的json返回
ctx.JSON(http.StatusOK, gin.H{
"message": "hello word",
})
// 适合返回byte类型的转化
ctx.Data(http.StatusOK, "application/json", nil)
// 返回html
ctx.HTML(http.StatusOK, "index.html", gin.H{"msg": "hello word"})
// 重定向
ctx.Redirect(301, "www.baidu.com")
九、context的使用
1、设置
ctx.Set("uid", 123)
ctx.Set("name", "admin")
2、读取
ctx.GetInt64("uid")
ctx.GetString("name")
十、开启服务并优雅的关闭服务
engine := gin.Default()
// 开启一个 goroutine启动服务
server := &http.Server{
Addr: "0.0.0.0:8080",
Handler: engine,
}
go func() {
err := server.ListenAndServe()
if err != nil && err != http.ErrServerClosed {
log.Fatal("server start err", err)
}
}()
// 等待中断信号来优雅地关闭服务器,为关闭服务器操作设置一个5秒的超时
quit := make(chan os.Signal, 1) // 创建一个接收信号的通道
// kill 默认会发送 syscall.SIGTERM 信号
// kill -2 发送 syscall.SIGINT 信号,我们常用的Ctrl+C就是触发系统SIGINT信号
// kill -9 发送 syscall.SIGKILL 信号,但是不能被捕获,所以不需要添加它
// signal.Notify把收到的 syscall.SIGINT或syscall.SIGTERM 信号转发给quit
signal.Notify(quit, os.Interrupt)
<-quit // 阻塞在此,当接收到上述两种信号时才会往下执行
log.Println("Shutdown Server ...")
// 创建一个5秒超时的context
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
// 5秒内优雅关闭服务(将未处理完的请求处理完再关闭服务),超过5秒就超时退出
if err := server.Shutdown(ctx); err != nil {
log.Fatal("Server Shutdown:", err)
}