1. 程式人生 > 其它 >4-gin渲染

4-gin渲染

一 各種資料格式的響應

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")
}