Justin-刘清政的博客

go/4-Go语言框架/4-1-gin框架/4-gin渲染

2020-09-16

一 各种数据格式的响应

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
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()方法可以加载模板文件

目录结构

image-20200916004820498

index.html

1
2
3
4
5
6
7
8
9
10
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{{.title}}</title>
</head>
<body>
我的名字是:{{.name}}
</body>
</html>

main.go

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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()
}

三 重定向

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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时,不应该使用原始上下文,必须使用它的只读副本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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")
}
使用支付宝打赏
使用微信打赏

点击上方按钮,请我喝杯咖啡!

扫描二维码,分享此文章