HuldaGnodim 发表于 2022-7-14 15:36

gin框架05

gin渲染

1、各种数据格式的响应


json、结构体、XML、YAML类似于java的properties、ProtoBuf
package mainimport (    "github.com/gin-gonic/gin"    "github.com/gin-gonic/gin/testdata/protoexample")// 多响应方式func main() {    // 1. 创建路由器    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{"name":"abc"})    })    // 4.YAML响应    r.GET("/someYAML",func(c *gin.Context){      c.YAML(200,gin.H{"name":"zhangsan"})    })    // 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)    })    // 3.监听端口,默认8080    r.Run(":8000")}
JSON结果

HTML模板渲染


1、gin支持加载HTML模板,然后根据模板参数进行配置并返回相应的数据,本质上就是字符串替换。
2、LoadHTMLClob()方法可以加载模板文件
package mainimport (    "github.com/gin-gonic/gin")// HTML渲染func main() {    // 1. 创建路由器    r := gin.Default()    // 加载模板文件    r.LoadHTMLGlob("templates/*")    // r.LoadHTML    r.GET("/index", func(c *gin.Context) {      // 根据文件名渲染      // 最终json将title替换      c.HTML(200,"index.tmpl",gin.H{"title":"我的标题"})    })    // 3.监听端口,默认8080    r.Run(":8000")}
模板

重定向

package mainimport (    "github.com/gin-gonic/gin"    "net/http")// HTML渲染func main() {    // 1. 创建路由器    r := gin.Default()    r.GET("/redirect", func(c *gin.Context) {      // 支持内部和外部重定向      c.Redirect(http.StatusMovedPermanently,"http://baidu.com")    })    // 3.监听端口,默认8080    r.Run(":8000")}同步异步


goroutine机制可以方便地实现异步处理
另外,在启动新的goroutine时,不应该使用原始上下文,必须使用它的只读副本
package mainimport (    "fmt"    "github.com/gin-gonic/gin"    "time")// HTML渲染func main() {    // 1. 创建路由器    r := gin.Default()    // 1.同步    r.GET("/long_async", func(c *gin.Context) {      // 需要搞一个副本      copyContext := c.Copy()      // 异步处理      go func() {            time.Sleep(3* time.Second)            fmt.Println("异步执行:"+copyContext.Request.URL.Path)      }()    })    // 2.异步    r.GET("/long_sync", func(c *gin.Context) {      time.Sleep(3* time.Second)      fmt.Println("同步执行:"+c.Request.URL.Path)    })    // 3.监听端口,默认8080    r.Run(":8000")}
页: [1]
查看完整版本: gin框架05