Go模板引擎 教程

Go 语言内置了 text/template 和 html/template 两个模板库,专门用于处理网页 html 模板。

其中,html/template 是在 text/template 模板库的基础上增加了对 html 输出的安全处理,主要目的是为了防止被攻击。

 

1. Go 模版引擎使用流程

  • 编写模版代码;
  • 导入包;
  • 加载模版代码;
  • 根据模版参数渲染模版。
    •  

      2. Go 模版引擎使用范例

      1)编写模版代码

      在项目下先创建 views 目录,用于存放模板文件。比如:将下面模版代码保存至 views/demo.tpl 文件中。

      {{define "demo"}}
      这是测试内容:{{.}}
      {{end}}
      

      代码中 define "模板名" 用于定义子模板,后面渲染模板会用到这个名字。

      2)导入包

      import "text/template"
      

      本文主要以 text/template 为例,如果要使用 html/template 直接替换包名就行,他们接口一样。

      3)加载模版代码

      // 加载模版代码,并且创建 template 对象 t
      // template.ParseGlob 函数加载 views 目录下的所有 tpl 为后缀的模版文件
      // template.Must 函数主要用于检测加载的模版有没有错误,有错误输出 panic 错误,并且结束程序。
      t := template.Must(template.ParseGlob("./views/*.tpl"))
      

      4)根据模版参数渲染模版

      定义模版参数:

      Go 模板引擎默认只能传入一个模版参数,如果想传入多个模版参数,可以使用 map 或者 struct 类型。

      // 比如定义了一个字符串参数,实际上模版可以是任意类型数据
      content := "Hello World, 编程教程"
      

      使用模板参数渲染模板:

      err := t.ExecuteTemplate(os.Stdout, "demo", content)
      if err != nil {
          log.Println("executing template:", err)
      }
      

      5)整体代码

      package main
      
      import (
          "log"
          "os"
          "text/template"
      )
      
      func main() {
          t := template.Must(template.ParseGlob("./views/*.tpl"))
      
          content := "Hello World, 编程教程"
          err := t.ExecuteTemplate(os.Stdout, "demo", content)
          if err != nil {
              log.Println("executing template:", err)
          }
      }    
      

      运行输出结果:

      这是测试内容:Hello World, 编程教程
      

      根据不同的模版参数,渲染模版输出不同的页面内容,就是模版引擎的主要工作,目的是简化 html 模版输出工作。

       

      3. Gin框架 使用 Go模版引擎

      各种 Go 路由框架,比如 Gin,Beego都提供了自己的模板引擎,都是对 Go 模版引擎的进一步封装,语法相同,无需另行学习。

      比如在 Gin框架 中使用模板:

      1)编写模版代码

      将下面模版代码保存至 views/demo.tpl 文件中, 文件后缀名随意。

      {{define "demo"}}
      这是测试内容:{{.content}}
      {{end}}
      

      2)在 Gin框架 代码中调用模板

      func (s *Category) Get(c *gin.Context) {
          content := "Hello World, 编程教程"
          c.HTML(http.StatusOK, "views/demo.tpl", gin.H{
              "content": content,
          })
      }
      

      Go模板引擎 template基本语法:Go模板引擎的模板表达式都包括在{{ 和 }} 之间。go template 语法和使用:Go模板引擎的语法格式:{{ 模板表达式 }} 。在模版文件中通过 点( . ) 引用模版参数。因为在渲染模版的时候只能传入一个参数,所以 点( . ) 正好可以代表模版参数的引用。模版参数支持数字、布尔值、字符串、map、struct、数组类型。