You are viewing an old version of this page. View the current version.
Compare with Current View Page History
« Previous Version 5 Next »
模板引擎默认使用了 {{ 和 }} 作为左右闭合标签,开发者可通过gview.SetDelimiters方法设置自定义的模板闭合标签。
{{
}}
gview.SetDelimiters
使用 . 来访问当前对象的值(模板局部变量)。
.
使用 $ 来引用当前模板根级的上下文(模板全局变量)。
$
使用 $var 来访问特定的模板变量。
$var
模板中支持的 go 语言符号
go
{{"string"}} // 一般 string {{`raw string`}} // 原始 string {{'c'}} // byte {{print nil}} // nil 也被支持
模板中的 pipeline
pipeline
可以是上下文的变量输出,也可以是函数通过管道传递的返回值
{{. | FuncA | FuncB | FuncC}}
当pipeline的值等于:
false
0
nil的指针
interface
array
slice
map
string
那么这个pipeline被认为是空。
需要注意:在gf模板引擎中,当模板中展示的指定变量不存在时,将会显示为空(标准库模板引擎会展示<no value>)。
gf
<no value>
if … else … end
{{if pipeline}}...{{end}}
if判断时,pipeline为空时,相当于判断为false。
if
支持嵌套的循环
{{if .condition}} ... {{else}} {{if .condition2}} ... {{end}} {{end}}
也可以使用else if进行
else if
{{if .condition}} ... {{else if .condition2}} ... {{else}} ... {{end}}
range … end
{{range pipeline}} {{.}} {{end}}
pipeline支持的类型为slice, map, channel。
channel
注意:在range循环内部,. 符号会被覆盖为以上类型的子元素(局部变量)。如果想在循环中访问外部变量(全局变量),请加上$符号,如:{{$.Session.Name}}
range
{{$.Session.Name}}
此外,对应的值长度为0时,range不会执行,. 不会改变。
例如,遍历map:
{{range $key, $value := .MapContent}} {{$key}}:{{$value}} {{end}}
例如,遍历slice:
{{range $index, $elem := .SliceContent}} {{range $key, $value := $elem}} {{$key}}:{{$value}} {{end}} {{end}}
with … end
{{with pipeline}}...{{end}}
with用于重定向pipeline
with
{{with .Field.NestField.SubField}} {{.Var}} {{end}}
define
define可以用来自定义模板内容块(给一段模板内容定义一个模板名称),可用于模块定义和模板嵌套(使用在template标签中)。
template
{{define "loop"}} <li>{{.Name}}</li> {{end}}
其中loop为该模板内容块的名称,随后可使用 template 标签调用模板:
loop
<ul> {{range .Items}} {{template "loop" .}} {{end}} </ul>
define标签需要结合template标签一起使用,并且支持跨模板使用(在同一模板目录/子目录下有效,原理是使用的ParseFiles方法解析模板文件)。
ParseFiles
{{template "模板名称" pipeline}}
将对应的上下文pipeline传给模板,才可以在模板中调用。
注意:template标签参数为模板名称,而不是模板文件路径,template标签不支持模板文件路径。
模板名称
template标签需要结合define标签一起使用,并且支持跨模板使用(在同一模板目录/子目录下有效,原理是使用的ParseFiles方法解析模板文件)。
include
该标签为gf框架模板引擎新增标签
{{include "模板文件名(需要带完整文件名后缀)" pipeline}}
在模板中可以使用include标签载入其他模板(任意路径),模板文件名支持相对路径以及文件的系统绝对路径。如果想要把当前模板的模板变量传递给子模板(嵌套模板),可以这样:
{{include "模板文件名(需要带完整文件名后缀)" .}}
与template标签的区别是:include仅支持文件路径,不支持模板名称;而tempalte标签仅支持模板名称,不支持文件路径。
tempalte
允许多行文本注释,不允许嵌套。
{{/* comment content support new line */}}