## 特性
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