golang之template渲染初解|青训营笔记

70 阅读2分钟

这是我参与[第五届青训营]的第十六天

在golang项目中,可以对同名的文件进行定义,go语言对.tmpl文件可以进行自定义的程序判断内容,进行template的渲染和pipeline传参。

{{define "posts/index.tmpl"}}
<!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="id=edge">
    <title>posts/index</title>
</head>
<body>
{{.title}}
</body>
</html>
{{end}}

Go语言内置了文本模板引擎text/template和用于HTML文档的html/template。它们的作用机制可以简单归纳如下:

  1. 模板文件通常定义为.tmpl.tpl为后缀(也可以使用其他的后缀),必须使用UTF8编码。
  2. 模板文件中使用{{}}包裹和标识需要传入的数据。
  3. 传给模板这样的数据就可以通过点号(.)来访问,如果数据是复杂类型的数据,可以通过{ { .FieldName }}来访问它的字段。
  4. {{}}包裹的内容外,其他内容均不做修改原样输出。
// 静态文件
// html页面上用到的样式文件./xxx/picture/ js文件 图片
func main() {
   r := gin.Default()
   // 加载静态文件
   r.Static("/xxx", "./statics")
   // gin框架中给模板参加自定义函数
   r.SetFuncMap(template.FuncMap{
      "safe": func(str string) template.HTML {
         return template.HTML(str)
      },
   })
   //r.LoadHTMLFiles("templates/index.tmpl") // 模板解析
   r.LoadHTMLGlob("templates/**/*")
   r.GET("/posts/index", func(c *gin.Context) {
      // HTTP请求
      c.HTML(http.StatusOK, "posts/index.tmpl", gin.H{ //模板渲染
         "title": "itistimetocode.com",
      })
   })
   r.GET("/users/index", func(c *gin.Context) {
      // HTTP请求
      c.HTML(http.StatusOK, "users/index.tmpl", gin.H{ //模板渲染
         "title": "<a href='https://itistimetocode.com'>chaodyna的博客</a>",
      })
   })
   // 返回从网上下载的模板
   r.GET("/home", func(c *gin.Context) {
      c.HTML(http.StatusOK, "home.html", nil)
   })

   r.Run(":9090") // 启动server
}

在go语言中,可以定义自定义函数,使得被转义的传递的字符串,重新定义为原本的程序代码,比如前端使用的html,css和js语法等。

pipeline是指产生数据的操作。比如{{.}}{{.Name}}等。Go的模板语法中支持使用管道符号|链接多个命令,用法和unix下的管道类似:|前面的命令会将运算结果(或返回值)传递给后一个命令的最后一个位置。