当前位置: 首页 > ops >正文

Java转Go日记(五十六):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.创建路由// 默认使用了2个中间件Logger(), Recovery()r := gin.Default()// 1.jsonr.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    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响应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)})r.Run(":8000")
}

2. HTML模板渲染

  • gin支持加载HTML模板, 然后根据模板参数进行配置并返回相应的数据,本质上就是字符串替换
  • LoadHTMLGlob()方法可以加载模板文件
package mainimport ("net/http""github.com/gin-gonic/gin"
)func main() {r := gin.Default()r.LoadHTMLGlob("tem/*")r.GET("/index", func(c *gin.Context) {c.HTML(http.StatusOK, "index.html", gin.H{"title": "我是测试", "ce": "123456"})})r.Run()
}
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>{{.title}}</title>
</head><body>fgkjdskjdsh{{.ce}}</body>
</html>

目录结构:

 

  • 如果你的目录结构是下面的情况

代码如下:

package mainimport ("net/http""github.com/gin-gonic/gin"
)func main() {r := gin.Default()r.LoadHTMLGlob("tem/**/*")r.GET("/index", func(c *gin.Context) {c.HTML(http.StatusOK, "user/index.html", gin.H{"title": "我是测试", "address": "www.5lmh.com"})})r.Run()
}
{{ define "user/index.html" }}
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>{{.title}}</title>
</head><body>fgkjdskjdsh{{.address}}</body>
</html>
{{ end }}
  • 如果你想进行头尾分离就是下面这种写法了:

package mainimport ("net/http""github.com/gin-gonic/gin"
)func main() {r := gin.Default()r.LoadHTMLGlob("tem/**/*")r.GET("/index", func(c *gin.Context) {c.HTML(http.StatusOK, "user/index.html", gin.H{"title": "我是测试", "address": "www.5lmh.com"})})r.Run()
}

 

user/index.html文件代码:

{{ define "user/index.html" }}
{{template "public/header" .}}fgkjdskjdsh{{.address}}
{{template "public/footer" .}}
{{ end }}

public/header.html文件代码:

{{define "public/header"}}
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>{{.title}}</title>
</head><body>{{end}}

public/footer.html文件代码:

{{define "public/footer"}}
</body>
</html>
{{ end }}
  • 如果你需要引入静态文件需要定义一个静态文件目录
    r.Static("/assets", "./assets")

3. 重定向

package mainimport ("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.5lmh.com")})r.Run()
}

 

4. 同步异步

  • goroutine机制可以方便地实现异步处理
  • 另外,在启动新的goroutine时,不应该使用原始上下文,必须使用它的只读副本
package mainimport ("log""time""github.com/gin-gonic/gin"
)func main() {// 1.创建路由// 默认使用了2个中间件Logger(), Recovery()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(":8000")
}
http://www.xdnf.cn/news/8255.html

相关文章:

  • 可视化大屏实现全屏或非全屏
  • iOS使用Metal对采集视频进行渲染
  • 【YOLO】Docker搭建镜像+运行容器
  • 如何制作令人印象深刻的UI设计?
  • HTTP 协议详解
  • 全金属工业防爆散热风扇风压与散热效果的关系
  • 无人机飞行间隔安全智能评估、安全风险评估
  • 单片机——实现交通信号灯管理
  • 【mindspore系列】- 算子源码分析
  • 超越感官的实相:声、光、气味的科学与哲学探微
  • Azure 公有云基础架构与核心服务:从基础到实践指南
  • C++——STL——封装红黑树实现mymap与myset
  • SpringBoot3+Vue3开发宾馆住房管理系统
  • 如何在UI设计中更好地平衡美学与功能性?
  • 【论文精读】2022 CVPR--RealBasicVSR现实世界视频超分辨率(RealWorld VSR)
  • Go语言爬虫系列教程(二) HTTP请求与响应处理详解
  • 电脑无法识别打印机usb设备怎么办 一键解决!
  • OpenHarmony外设驱动使用 (十三),Vibrator
  • Java内存管理:堆和栈的概念和运行原理
  • 第 7 章:综合回顾与性能优化
  • C语言实现顺序存储结构
  • 【LINUX操作系统】线程池——线程部分综合运用并实现一个自己的线程池
  • Git使用说明
  • 调度关键路径里调整优先级导致hardlockup
  • AWS中创建ES集群(opensearch部署)
  • Laravel 连接 SQL Server 之 Linux 系统安装 unixODBC 和 Microsoft ODBC 驱动
  • Oracle查看SQL执行计划的方法
  • .NET外挂系列:7. harmony在高级调试中的一些实战案例
  • docker环境安装wlcn
  • upload-labs通关笔记-第20关 文件上传之杠点绕过