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")
}
分别在浏览器中输入以下内容,会得到具体的响应信息。
http://127.0.0.1:8080/someJSON
http://127.0.0.1:8080/someStruct
http://127.0.0.1:8080/someYAML
http://127.0.0.1:8080/someProtoBuf
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()
}
效果如下:
如果view目录还有子文件夹,使用 r.LoadHTMLGlob("tem/**/*")
去加载html文件夹,然后使用c.HTML(xxx, "user/index.html",xx),渲染html模板。
- 如果你想进行头尾分离就是下面这种写法了:
文件结构:
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()
}