Gin 入门学习 | 青训营笔记

126 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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 中文文档。

参考文档