gin渲染 各種資料格式的響應
阿新 • • 發佈:2021-06-28
★json、結構體、XML、YAML類似於java的properties、ProtoBuf
package main import ( "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/testdata/protoexample" ) // 多種響應方式 func main() { // 1.建立路由 // 預設使用了2箇中間件Logger(), Recovery() r := gin.Default() // 1.json r.GET("/someJSON", func(c *gin.Context) { c.JSON(200, gin.H{"message": "someJSON", "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": "abc"}) }) // 4.YAML響應 r.GET("/someYAML", func(c *gin.Context) { c.YAML(200, gin.H{"name": "zhangsan"}) }) // 5.protobuf格式,谷歌開發的高效儲存讀取的工具 // 陣列?切片?如果自己構建一個傳輸格式,應該是什麼格式?r.GET("/someProtoBuf", func(c *gin.Context) { reps := []int64{int64(1), int64(2)} // 定義資料 label := "label" // 傳protobuf格式資料 data := &protoexample.Test{ Label: &label, Reps: reps, } c.ProtoBuf(200, data) }) r.Run(":8000") }
★重定向
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.5lmh.com") }) r.Run() }
★同步非同步
- goroutine機制可以方便地實現非同步處理
- 另外,在啟動新的goroutine時,不應該使用原始上下文,必須使用它的只讀副本
package main import ( "log" "time" "github.com/gin-gonic/gin" ) func main() { // 1.建立路由 // 預設使用了2箇中間件Logger(), Recovery() r := gin.Default() // 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) }() }) // 2.同步 r.GET("/long_sync", func(c *gin.Context) { time.Sleep(3 * time.Second) log.Println("同步執行:" + c.Request.URL.Path) }) r.Run(":8000") }