4-gin渲染
阿新 • • 發佈:2021-12-01
一 各種資料格式的響應
package main import ( "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/testdata/protoexample" ) // 多種響應方式 func main() { r := gin.Default() // 1.響應jsonjson r.GET("/someJSON", func(c *gin.Context) { c.JSON(200, gin.H{"message": "成功", "status": 200}) }) // 2. 結構體響應 r.GET("/someStruct", func(c *gin.Context) { var msg struct { Name string Message string Number int } msg.Name = "root" msg.Message = "message" msg.Number = 123 c.JSON(200, msg) }) // 3.響應XML r.GET("/someXML", func(c *gin.Context) { c.XML(200, gin.H{"message": "成功","sex":"男"}) }) // 4.YAML響應 r.GET("/someYAML", func(c *gin.Context) { c.YAML(200, gin.H{"name": "lqz","sex":"男"}) }) // 5.protobuf格式,谷歌開發的高效儲存讀取的工具 r.GET("/someProtoBuf", func(c *gin.Context) { reps := []int64{int64(10), int64(20)} // 定義資料 label := "lqz_label" // protobuf 的具體定義寫在 testdata/protoexample 檔案中。 data := &protoexample.Test{ Label: &label, Reps: reps, } // 請注意,資料在響應中變為二進位制資料 // 將輸出被 protoexample.Test protobuf 序列化了的資料 c.ProtoBuf(200, data) }) r.Run(":8080") }
二 HTML模板渲染
- gin支援載入HTML模板, 然後根據模板引數進行配置並返回相應的資料,本質上就是字串替換
- LoadHTMLGlob()方法可以載入模板檔案
目錄結構
index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>{{.title}}</title> </head> <body> 我的名字是:{{.name}} </body> </html>
main.go
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.LoadHTMLGlob("templates/*")
r.GET("/index", func(c *gin.Context) {
c.HTML(http.StatusOK, "index.html", gin.H{"title": "我是測試", "name": "lqz"})
})
r.Run()
}
三 重定向
package main import ( "net/http" "github.com/gin-gonic/gin" ) func main() { r := gin.Default() r.GET("/index", func(c *gin.Context) { c.Redirect(http.StatusMovedPermanently, "http://www.liuqingzheng.top") }) r.Run() }
四 同步非同步
- goroutine機制可以方便地實現非同步處理
- 另外,在啟動新的goroutine時,不應該使用原始上下文,必須使用它的只讀副本
package main
import (
"github.com/gin-gonic/gin"
"log"
"time"
)
func main() {
r := gin.New()
// 1.非同步
r.GET("/long_async", func(c *gin.Context) {
// 需要搞一個副本
copyContext := c.Copy()
// 非同步處理
go func() {
time.Sleep(3 * time.Second)
log.Println("非同步執行:" + copyContext.Request.URL.Path)
}()
c.JSON(200,gin.H{"msg":"非同步請求成功"})
})
// 2.同步
r.GET("/long_sync", func(c *gin.Context) {
time.Sleep(3 * time.Second)
log.Println("同步執行:" + c.Request.URL.Path)
c.JSON(200,gin.H{"msg":"同步請求成功"})
})
r.Run(":8000")
}