## 特性
1. **快速**:路由不使用反射,基于Radix树,内存占用少。
2. **中间件**:HTTP请求,可先经过一系列中间件处理,例如:Logger,Authorization,GZIP等。这个特性和 NodeJs 的`Koa`框架很像。中间件机制也极大地提高了框架的可扩展性。
3. **异常处理**:服务始终可用,不会宕机。Gin 可以捕获 panic,并恢复。而且有极为便利的机制处理HTTP请求过程中发生的错误。
4. **JSON**:Gin可以解析并验证请求的JSON。这个特性对`Restful API`的开发尤其有用。
5. **路由分组**:例如将需要授权和不需要授权的API分组,不同版本的API分组。而且分组可嵌套,且性能不受影响。
6. **渲染内置**:原生支持JSON,XML和HTML的渲染
## 安装
````
go get -u -v github.com/gin-gonic/gin
````
## 使用
```
package main
import "github.com/gin-gonic/gin"
func main() {
//生成一个实例
r := gin.Default()
//定义一个路由,当用户访问/test时,返回显示"I'm ok"
r.GET("/test", func(c *gin.Context) {
c.String(200, "I'm ok")
})
//运行,且指定在1111端口运行
r.Run(":1111")
}
```
## 路由`Route`
### 请求方法
`GET`、`POST`、`DELETE`、`PUT`、`PATCH`、`OPTIONS`、`ANY`(`ANY`可以匹配任意请求方法)
### 解析路径参数(http://localhost:1111/hello/tianyuan)
```
r.GET("/hello/:name", func(c *gin.Context) {
name := c.Param("name")
c.String(http.StatusOK, "Hello %s", name)
})
```
`:name`必须传入`name`参数
`*sex`可选传入`sex`参数
### 解析query参数(http://localhost:1111/hello?name=tianyuan&sex=男)
```
r.GET("/hello", func(c *gin.Context) {
name := c.Query("name")
//sex为可选参数,默认男
sex := c.DefaultQuery("sex", "男")
c.String(http.StatusOK, "%s的性别是%s", name, sex)
})
```
### 解析POST参数
```
r.POST("/form", func(c *gin.Context) {
username := c.PostForm("username")
password := c.DefaultPostForm("password", "123456")
c.JSON(http.StatusOK, gin.H{
"username": username,
"password": password,
})
})
```
### Map参数
```
ids := c.QueryMap("ids")
names := c.PostFormMap("names")
```
### 重定向
```
func main() {
//生成一个实例
r := gin.Default()
r.GET("/test", func(c *gin.Context) {
//方案1
c.Redirect(http.StatusMovedPermanently, "/index")
//方案2
c.Request.URL.Path = "/index"
r.HandleContext(c)
})
r.GET("/index", func(c *gin.Context) {
c.String(http.StatusOK, "index")
})
//运行,且指定在1111端口运行
r.Run(":1111")
}
```
### 路由分组
```
func main() {
//生成一个实例
r := gin.Default()
defaultHandler := func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"path": c.FullPath(),
})
}
v1 := r.Group("/v1")
{
v1.GET("posts", defaultHandler)
v1.GET("series", defaultHandler)
}
v2 := r.Group("/v2")
{
v2.GET("/posts", defaultHandler)
v2.GET("/series", defaultHandler)
}
//运行,且指定在1111端口运行
r.Run(":1111")
}
```
### 上传文件
```
//单文件
file, _ := c.FormFile("file")
// 多文件
form, _ := c.MultipartForm()
files := form.File["upload[]"]
for _, file := range files {
log.Println(file.Filename)
// c.SaveUploadedFile(file, dst)
}
```
### HTML模板
### 中间件
```
r.Use(gin.Logger())
```
### 热加载调试`Hot Reload`
加载库
```
go get -v -u github.com/pilu/fresh
```
运行`fresh`
- php
- 安全
- php7
- 特性
- 编译安装
- 源码整体框架
- 基本变量
- thinkphp3.2.3
- thinkphp5.0
- thinkphp6.0
- laravel
- 配置
- 路由
- artisan控制台
- eloquent
- tinker
- composer
- 加密解密
- 小知识点
- 数组
- string
- 代码简洁之道
- 编译
- 语法糖
- lumen
- smarty
- 错题集
- 算法及数据结构
- 线性表结构
- 插入排序
- 冒泡排序
- 数据库
- mysql
- oracle
- PostgreSQL
- redis
- sqlserver
- 前端
- 备忘
- js
- nodejs
- vue
- css
- electron
- vue
- 语法糖
- colorui使用笔记
- 微信小程序
- 操作系统
- windows
- bat
- 快捷键
- linux
- sed
- 问题解决
- git
- docker
- docker-compose
- 正则表达式
- ps
- lua
- 协议相关
- 问题思索
- Golang
- 测试
- 读取和写入json配置文件
- 类
- 接口
- mod
- gin
- fyne
- 禅道二次开发
- 服务
- apache
- 漏洞配置
- http server优化
- nginx
- 安装
- 面试题库
- freeswitch