栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Go语言

gin context和官方context

Go语言 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

gin context和官方context

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/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代码如下:




    
    {<!-- -->{.title}}


name : {{.name}}

go代码:

package main
​
import (
    "github.com/gin-gonic/gin"
    "net/http"
)
​
func main() {
    r := gin.Default()
    r.LoadHTMLGlob("view*") 去加载html文件夹,然后使用c.HTML(xxx, "user/index.html",xx),渲染html模板。

  • 如果你想进行头尾分离就是下面这种写法了:

文件结构:

header.html代码:

  {{define "public/header"}}
  
  
  
      
      {<!-- -->{.title}}
  
  
  {{end}}

footer.html代码:

  {{define "public/footer"}}
      
      
  {{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()
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/945630.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号