一、各种数据格式的响应

  • json、结构体、XML、YAML类似于java的properties、ProtoBuf ```go 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) })

  1. r.Run(":8000")

}

  1. <a name="A7AXt"></a>
  2. # 二、HTML模板渲染
  3. - gin支持加载HTML模板, 然后根据模板参数进行配置并返回相应的数据,本质上就是字符串替换
  4. - LoadHTMLGlob()方法可以加载模板文件
  5. ```go
  6. package main
  7. import (
  8. "net/http"
  9. "github.com/gin-gonic/gin"
  10. )
  11. func main() {
  12. r := gin.Default()
  13. r.LoadHTMLGlob("E:/gin/03/tem/*")
  14. r.GET("/index", func(c *gin.Context) {
  15. c.HTML(http.StatusOK, "index.html", gin.H{"title": "我是测试", "ce": "123456"})
  16. })
  17. r.Run(":8000")
  18. }
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <title>{{.title}}</title>
  8. </head>
  9. <body>
  10. fgkjdskjdsh{{.ce}}
  11. </body>
  12. </html>

image.png

三、重定向

  1. package main
  2. import (
  3. "net/http"
  4. "github.com/gin-gonic/gin"
  5. )
  6. func main() {
  7. r := gin.Default()
  8. r.GET("/index", func(c *gin.Context) {
  9. c.Redirect(http.StatusMovedPermanently, "http://www.5lmh.com")
  10. })
  11. r.Run()
  12. }

四、同步异步

  • goroutine机制可以方便地实现异步处理
  • 另外,在启动新的goroutine时,不应该使用原始上下文,必须使用它的只读副本 ```go package main

import ( “log” “time”

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

  1. r.Run(":8000")

}

```