gin渲染
1、各种数据格式的响应
json、结构体、XML、YAML类似于java的properties、ProtoBuf
package main
import (
"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 main
import (
"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 main
import (
"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 main
import (
"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")
}