gin的渲染

1 各种数据格式的响应

  • json、结构体、XML、YAML类似于java的properties、ProtoBuf

分别对所有数据格式举个列子

func main() {
    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":"you"})
    })
​
    //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(":8080")
}

分别在浏览器中输入以下内容,会得到具体的响应信息。

2 HTML模板渲染

  • gin支持加载HTML模板,然后根据模板参数进行配置并返回响应的数据,本质上就是字符串替换
  • LoadHTMLGlob()方法可以加载模板文件

举个最简单的例子:

把index.html放在view目录下,index.html代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{{.title}}</title>
</head>
<body>
name : {{.name}}
</body>
</html>

go代码:

package main
​
import (
    "github.com/gin-gonic/gin"
    "net/http"
)
​
func main() {
    r := gin.Default()
    r.LoadHTMLGlob("view/*")
    r.GET("/index", func(c *gin.Context) {
        c.HTML(http.StatusOK, "index.html", gin.H{"title": "我是gin", "name": "you"})
    })
    r.Run()
}

效果如下:




r.LoadHTMLGlob("tem/**/*")
  • 如果你想进行头尾分离就是下面这种写法了:

文件结构:


header.html代码:

  {{define "public/header"}}
  <!DOCTYPE html>
  <html lang="en">
  <head>
      <meta charset="UTF-8">
      <title>{{.title}}</title>
  </head>
  <body>
  {{end}}

footer.html代码:

  {{define "public/footer"}}
      </body>
      </html>
  {{end}}

index.html代码:

  {{ define "user/index.html" }}
      {{template "public/header" .}}
      name: {{.name}}
      {{template "public/footer" .}}
  {{ end }}

go代码:

  func main() {
    r := gin.Default()
    r.LoadHTMLGlob("view/**/*")
    r.GET("/index", func(c *gin.Context) {
        c.HTML(http.StatusOK, "user/index.html", gin.H{"title": "我是gin", "name": "you1"})
    })
    r.Run()
  }

效果演示:


  • 如果你需要引入静态文件需要定义一个静态文件目录
    r.Static("/assets", "./assets")

3 重定向

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.baidu.com")
    })
    r.Run()
}


4 同步异步

  • goroutine机制可以方便地实现异步处理
  • 另外,在启动新的goroutine时,不应该使用原始上下文,必须使用它的只读副本。
package main
​
import (
    "github.com/gin-gonic/gin"
    "log"
    "time"
)
func main() {
    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()
}