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 stringMessage stringNumber int}msg.Name = "root"msg.Message = "message"msg.Number = 123c.JSON(200,msg)})
//3. XMLr.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/someXML
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()
}