这是我参与「第三届青训营 -后端场」笔记创作活动的第3篇笔记。Gin 是使用 Go/golang 语言实现的 HTTP Web 框架。接口简洁,性能极高。
具有以下几个特性:
- 快速:路由不使用反射,基于Radix树,内存占用少。
- 中间件: HTTP请求,可先经过一系列中间件处理,例如:Logger,Authorization,GZIP等。这个特性和 NodeJs 的
Koa框架很像。中间件机制也极大地提高了框架的可扩展性。 - JSON: Gin可以解析并验证请求的JSON。这个特性对
Restful API的开发尤其有用。 - 路由分组:例如将需要授权和不需要授权的API分组,不同版本的API分组。而且分组可嵌套,且性能不受影响。
- 渲染内置:原生支持JSON,XML和HTML的渲染
开始学习之旅!
安装Gin
go get -u -v github.com/gin-gonic/gin
快速开始QuickStart:
package main
import "github.com/gin-gonic/gin"
func main() {
r := gin.Default()
r.GET("/", func(c *gin.Context) {
c.String(200, "Hello, Suyame")
})
r.Run() // listen and serve on 0.0.0.0:8080
}
说明:
1. 使用gin.Default()生成了一个实例。
2. 使用r.Get("/",...)声明了一个路由,告诉gin什么样的URL能触发传入的函数,然后这个函数返回我们想要显示在用户浏览器中的信息。
3. 最后用r.Run()函数来让应用运行在本地服务器上,默认监听端口是 8080,可以传入参数设置端口,例如r.Run(":9999")即运行在 9999端口。
运行此Go代码:
$ go run main.go
[GIN-debug] GET / --> main.main.func1 (3 handlers)
[GIN-debug] Environment variable PORT is undefined. Using port :8080 by default
[GIN-debug] Listening and serving HTTP on :8080
浏览器访问:http://localhost:8080
路由
路由方法有 GET, POST, PUT, PATCH, DELETE 和 OPTIONS,还有Any,可匹配以上任意类型的请求。
无参数
- 无参数路由
// 静态路由
r.GET("/demo/", func(c *gin.Context) {
c.String(http.StatusOK, "Who are you?")
})
- 解析路径参数
// 动态路由
r.GET("user/:name", func(c *gin.Context) {
name := c.Param("name")
c.String(http.StatusOK, "Hello %s !", name)
})
- 分组路由(Grouping Routes)
如果有一组路由,前缀都是
/api/v1开头,是否每个路由都需要加上/api/v1这个前缀呢?答案是不需要,分组路由可以解决这个问题。利用分组路由还可以更好地实现权限控制,例如将需要登录鉴权的路由放到同一分组中去,简化权限控制
// group routes 分组路由
defaultHandler := func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"path": c.FullPath(),
})
}
// group: v1
v1 := r.Group("/v1")
{
v1.GET("/posts", defaultHandler)
v1.GET("/series", defaultHandler)
}
// group: v2
v2 := r.Group("/v2")
{
v2.GET("/posts", defaultHandler)
v2.GET("/series", defaultHandler)
}
通过 router.Group 返回一个新的分组路由,通过新的分组路由把之前的路由进行简单的修改。当然分组里面仍旧可以嵌套分组。
分组不仅仅是将相同逻辑的代码放到一起,而且可以提供相同的路由前缀,修改后的路由仍旧和之前一致。
总结
Gin路由的使用方法非常方便,是一个比较友好的框架。