Golang从入门到登堂20201112-gin框架学习文档(3)

四、gin渲染

1. 各种数据格式的响应

  • Json,Struct,XML,YAML,ProtoBuf
    后台代码

    	// 1. json
    	r.GET("/someJson", func(c *gin.Context) {
    		c.JSON(http.StatusOK, gin.H{"message": "json", "status": http.StatusOK})
    	})
    
    	// 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 = 1
    
    		c.JSON(http.StatusOK, msg)
    	})
    
    	// 3.XML
    	r.GET("/someXML", func(c *gin.Context) {
    		c.XML(http.StatusOK,gin.H{
    			"message":"msg",
    		})
    	})
    
    	// 4.YAML响应
    	r.GET("/someYaml", func(c *gin.Context) {
    		c.YAML(http.StatusOK,gin.H{
    			"name":"henry",
    		})
    	})
    
    	// 5.protobuf格式,谷歌开发的高效存储读取的工具
    	r.GET("/someProtobufBuf", func(c *gin.Context) {
    		resp :=[]int64{int64(1),int64(2)}
    		// 定义数据
    		label := "label"
    		// 传protoBuf格式数据
    		data := &protoexample.Test{
    			Label:            &label,
    			Reps:             resp,
    		}
    
    		c.ProtoBuf(http.StatusOK,data)
    	})
    

2. HTML模板渲染

  • gin支持加载HTML模块,然后根据模板参数进行配置并返回相应的数据,本质是字符串替换

  • LoadHTMLGlob()方法可以加载模块文件,r.LoadHTMLFiles() 加载单个文件

    后台代码

    //创建默认路由
    r := gin.Default()
    // 加载模板文件,文件夹下所有
    r.LoadHTMLGlob("test/*")
    //r.LoadHTMLFiles()  加载文件
    
    r.GET("/index", func(c *gin.Context) {
    	// 根据文件名渲染
    	c.HTML(http.StatusOK,"index.tmpl",gin.H{
    		"title":"myTitle",
    	})
    })
    

    前台代码

    <html>
      <h1>
      {{.title}}
      </h1>
    </html>
    

3. 重定向

关键函数: c.Redirect()
后台代码

	r.GET("/redirect", func(c *gin.Context) {
		c.Redirect(http.StatusMovedPermanently,"http://www.baidu.com")
	})

4. 同步异步

  • goroutine机制可以方便地实现异步处理

  • 另外,在启动新的goroutine时,不应该使用原始上下文,必须使用它的只读副本
    关键函数: 异步需要copy一个context去使用

    后台代码

    // 1.异步
    r.GET("/login_async", func(c *gin.Context) {
    	// 需要搞一个副本
    	copyContext := c.Copy()
    	// 异步处理
    	go func() {
    		time.Sleep(3 * time.Second)
    		log.Println("异步执行: ", copyContext.Request.URL.Path)
    	}()
    })
    
    // 2.同步
    r.GET("/login_sync", func(c *gin.Context) {
    	time.Sleep(3 * time.Second)
    	log.Println("同步执行: ", c.Request.URL.Path)
    })
    

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值