日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

gin context和官方context_Go语言gin框架从入门到精通(3)

發(fā)布時(shí)間:2025/3/15 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 gin context和官方context_Go语言gin框架从入门到精通(3) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

gin的渲染

1 各種數(shù)據(jù)格式的響應(yīng)

  • json、結(jié)構(gòu)體、XML、YAML類(lèi)似于java的properties、ProtoBuf

分別對(duì)所有數(shù)據(jù)格式舉個(gè)列子

func main() {r := gin.Default() ?//1. json響應(yīng)r.GET("/someJSON", func(c *gin.Context) {c.JSON(200,gin.H{"message":"someJSON","status":200})})//2. 結(jié)構(gòu)體響應(yīng)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響應(yīng)r.GET("/someYAML", func(c *gin.Context) {c.YAML(200,gin.H{"name":"you"})}) ?//5.Protobuf格式,谷歌開(kāi)發(fā)的高效存儲(chǔ)讀取的工具r.GET("/someProtoBuf", func(c *gin.Context) {reps := []int64{int64(1), int64(2)}//定義數(shù)據(jù)label := "label"//傳protobuf格式數(shù)據(jù)data := &protoexample.Test{Label: &label,Reps: reps,}c.ProtoBuf(200,data)}) ?r.Run(":8080") }

分別在瀏覽器中輸入以下內(nèi)容,會(huì)得到具體的響應(yīng)信息。

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模板,然后根據(jù)模板參數(shù)進(jìn)行配置并返回響應(yīng)的數(shù)據(jù),本質(zhì)上就是字符串替換
  • LoadHTMLGlob()方法可以加載模板文件

舉個(gè)最簡(jiǎn)單的例子:

把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模板。

  • 如果你想進(jìn)行頭尾分離就是下面這種寫(xiě)法了:

文件結(jié)構(gòu):

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()}

效果演示:

  • 如果你需要引入靜態(tài)文件需要定義一個(gè)靜態(tài)文件目錄
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機(jī)制可以方便地實(shí)現(xiàn)異步處理
  • 另外,在啟動(dòng)新的goroutine時(shí),不應(yīng)該使用原始上下文,必須使用它的只讀副本。
package main ? import ("github.com/gin-gonic/gin""log""time" ) func main() {r := gin.Default()//1. 異步r.GET("/long_async", func(c *gin.Context) {//需要搞一個(gè)副本copyContext := c.Copy()//異步處理go func() {time.Sleep(3 * time.Second)log.Println("異步執(zhí)行:" + copyContext.Request.URL.Path)}()}) ?//2. 同步r.GET("/long_sync", func(c *gin.Context) {time.Sleep(3 * time.Second)log.Println("同步執(zhí)行:" + c.Request.URL.Path)})r.Run() }

總結(jié)

以上是生活随笔為你收集整理的gin context和官方context_Go语言gin框架从入门到精通(3)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。