模板引擎默认使用了 {{
和 }}
作为左右闭合标签,开发者可通过gview.SetDelimiters
方法设置自定义的模板闭合标签。
使用 .
来访问当前对象的值(模板局部变量)。
使用 $
来引用当前模板根级的上下文(模板全局变量)。
使用 $var
来访问特定的模板变量。
模板中支持的 go
语言符号
{{"string"}} // 一般 string
{{`raw string`}} // 原始 string
{{'c'}} // byte
{{print nil}} // nil 也被支持
模板中的 pipeline
可以是上下文的变量输出,也可以是函数通过管道传递的返回值
{{. | FuncA | FuncB | FuncC}}
当pipeline
的值等于:
false
或0
nil的指针
或interface
- 长度为
0
的array
, slice
, map
, string
那么这个pipeline
被认为是空。
if … else … end
{{if pipeline}}...{{end}}
if
判断时,pipeline
为空时,相当于判断为false
。
支持嵌套的循环
{{if .condition}}
...
{{else}}
{{if .condition2}}
...
{{end}}
{{end}}
也可以使用else if
进行
{{if .condition}}
...
{{else if .condition2}}
...
{{else}}
...
{{end}}
range … end
{{range pipeline}} {{.}} {{end}}
pipeline
支持的类型为slice
, map
, channel
。
注意:在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 .Field.NestField.SubField}}
{{.Var}}
{{end}}
define
define
可以用来自定义模板内容块(给一段模板内容定义一个模板名称),可用于模块定义和模板嵌套(使用在template
标签中)。
{{define "loop"}}
<li>{{.Name}}</li>
{{end}}
其中loop
为该模板内容块的名称,随后可使用 template
标签调用模板:
<ul>
{{range .Items}}
{{template "loop" .}}
{{end}}
</ul>
template
{{template "模板名称" pipeline}}
将对应的上下文pipeline
传给模板,才可以在模板中调用。
注意:template
标签参数为模板名称
,而不是模板文件路径,template
标签不支持模板文件路径。
include
该标签为gf
框架模板引擎新增标签
{{include "模板文件名(需要带完整文件名后缀)" pipeline}}
在模板中可以使用include
标签载入其他模板(任意路径),模板文件名支持相对路径以及文件的系统绝对路径。如果想要把当前模板的模板变量传递给子模板(嵌套模板),可以这样:
{{include "模板文件名(需要带完整文件名后缀)" .}}
与template
标签的区别是:include
仅支持文件路径,不支持模板名称;而tempalte
标签仅支持模板名称,不支持文件路径。
注释
允许多行文本注释,不允许嵌套。
{{/*
comment content
support new line
*/}}
删除空白符号
删除移除空格换行符
# 使用{{-语法去除模板内容左侧的所有空白符号, 使用-}}去除模板内容右侧的所有空白符号。
# 注意:-要紧挨{{和}},同时与模板值之间需要使用空格分隔。
{{- .Name -}}
{{- range $key, $value := .list}}
"{{$value}}"
{{- end}}
更多使用说明
template package - html/template - Go Packages
template package - text/template - Go Packages
10 Comments
sanrentai
range 循环能否 break
郭强
似乎不行,模板只是展示,一般不需要有太复杂的流程控制能力。我特意帮你
google
了一下,参考下这个答案:https://stackoverflow.com/questions/43485290/how-to-use-continue-and-break-keywords-in-golang-templatesaries
golang的模板中可以通过动态的key取map中的值吗?
我有一个slice
keyList:=[ "2021-02", "2020-08", "2020-07", "2020-05", "2020-02", "2020-01", ]
还有一个map
dataMap := map[string]int{ "2021-02":123, "2020-08":234, "2020-07":234234, "2020-05":23423, "2020-02":345345345, "2020-01":456456, }
想在模板中通过循环slice得到map中的值
比如
{{range $index, $date := .keyList}} {{if .dataMap.$date}} # 这里貌似不对呀,不知道应该怎么取 {{range $key,$item := .dataList.$date}} <p>{{$date}}:{{$item}}</p> {{end}} {{end}} {{end}}
aries
经过大量搜索,找到办法了
丑的别致
支持模板继承吗?比如有个基座base.html 后续也页面都可以继承这个基座的基础上做
海亮
include模板嵌入
fy
哪位大神帮忙讲解下这个代码
range的最后面(.BuildIn.CategoryTree .ContentType)两个值是什么用法?
梦想与现实-广州大智汇
标签有些地方没介绍的,例如if标签怎么做变量之间的判断,我查chatGPT才知道
{{if eq .id "123"}}
<p>Welcome!</p>
{{else}}
<p>Welcome to my website!</p>
{{end}}
wilson
range 循环中 使用if判断 .Cookie.lang 就会报错: Template Parsing Error: template: /index.html:27:60: executing "/index.html" at <.Cookie.lang>: can't evaluate field Cookie in type *entity.Product
不支持这种写法吗?
wilson
搞定了,要用这种写法
<div class="item-title"> @{if eq $.Cookie.lang "zh-CN"} @{$value.CnName} @{else} @{$value.Name} @{end} </div>