模板引擎默认使用了 {{}} 作为左右闭合标签,开发者可通过 gview.SetDelimiters 方法设置自定义的模板闭合标签。

使用 . 来访问当前对象的值(模板局部变量)。

使用 $ 来引用当前模板根级的上下文(模板全局变量)。

使用 $var 来访问特定的模板变量。

模板中支持的 go 语言符号

  1. {{"string"}} // 一般 string
  2. {{`raw string`}} // 原始 string
  3. {{'c'}} // byte
  4. {{print nil}} // nil 也被支持

模板中的 pipeline

可以是上下文的变量输出,也可以是函数通过管道传递的返回值

  1. {{. | FuncA | FuncB | FuncC}}

pipeline 的值等于:

  • false0
  • nil的指针interface
  • 长度为 0array, slice, map, string

那么这个 pipeline 被认为是空。

模板引擎-模板标签 - 图1注意

需要注意:在 gf 模板引擎中,当模板中展示的指定变量不存在时,将会显示为空(标准库模板引擎会展示 <no value>)。

if … else … end

  1. {{if pipeline}}...{{end}}

if 判断时, pipeline 为空时,相当于判断为 false

支持嵌套的循环

  1. {{if .condition}}
  2. ...
  3. {{else}}
  4. {{if .condition2}}
  5. ...
  6. {{end}}
  7. {{end}}

也可以使用 else if 进行

  1. {{if .condition}}
  2. ...
  3. {{else if .condition2}}
  4. ...
  5. {{else}}
  6. ...
  7. {{end}}

range … end

  1. {{range pipeline}} {{.}} {{end}}

pipeline 支持的类型为 slice, map, channel

注意:在 range 循环内部, . 符号会被覆盖为以上类型的子元素(局部变量)。如果想在循环中访问外部变量(全局变量),请加上 $ 符号,如: {{$.Session.Name}}

此外,对应的值长度为 0 时, range 不会执行, . 不会改变。

例如,遍历 map:

  1. {{range $key, $value := .MapContent}}
  2. {{$key}}:{{$value}}
  3. {{end}}

例如,遍历 slice:

  1. {{range $index, $elem := .SliceContent}}
  2. {{range $key, $value := $elem}}
  3. {{$key}}:{{$value}}
  4. {{end}}
  5. {{end}}

with … end

  1. {{with pipeline}}...{{end}}

with 用于重定向 pipeline

  1. {{with .Field.NestField.SubField}}
  2. {{.Var}}
  3. {{end}}

define

define 可以用来 自定义模板内容块(给一段模板内容定义一个模板名称),可用于模块定义和模板嵌套(使用在 template 标签中)。

  1. {{define "loop"}}
  2. <li>{{.Name}}</li>
  3. {{end}}

其中 loop 为该模板内容块的名称,随后可使用 template 标签调用模板:

  1. <ul>
  2. {{range .Items}}
  3. {{template "loop" .}}
  4. {{end}}
  5. </ul>

模板引擎-模板标签 - 图2注意

define 标签需要结合 template 标签一起使用,并且支持跨模板使用(在同一模板目录/子目录下有效,原理是使用的 ParseFiles 方法解析模板文件)。

template

  1. {{template "模板名称" pipeline}}

将对应的上下文 pipeline 传给模板,才可以在模板中调用。

注意: template 标签参数为 模板名称,而不是模板文件路径, template 标签不支持模板文件路径。

模板引擎-模板标签 - 图3注意

template 标签需要结合 define 标签一起使用,并且支持跨模板使用(在同一模板目录/子目录下有效,原理是使用的 ParseFiles 方法解析模板文件)。

include

该标签为 gf 框架模板引擎新增标签

  1. {{include "模板文件名(需要带完整文件名后缀)" pipeline}}

在模板中可以使用 include 标签载入其他模板(任意路径),模板文件名支持 相对路径 以及文件的系统 绝对路径。如果想要把当前模板的模板变量传递给子模板(嵌套模板),可以这样:

  1. {{include "模板文件名(需要带完整文件名后缀)" .}}

template 标签的区别是: include 仅支持 文件路径,不支持 模板名称;而 tempalte 标签仅支持 模板名称,不支持 文件路径

注释

允许多行文本注释,不允许嵌套。

  1. {{/*
  2. comment content
  3. support new line
  4. */}}

删除空白符号

删除移除空格换行符

  1. # 使用{{-语法去除模板内容左侧的所有空白符号, 使用-}}去除模板内容右侧的所有空白符号。
  2. # 注意:-要紧挨{{和}},同时与模板值之间需要使用空格分隔。
  3. {{- .Name -}}
  4. {{- range $key, $value := .list}}
  5. "{{$value}}"
  6. {{- end}}

更多使用说明

template package - html/template - Go Packages

template package - text/template - Go Packages