基础语法
初始化变量
变量必须在使用前进行初始化:
{{ foo := "bar" }}
可以为初始化变量分配一个新值:
{{ foo = "asd" }}
在模板中初始化的变量没有固定类型,所以这也是有效的:
{{ foo = 4711 }}
将任何内容分配给
_
告诉 Jet 计算右侧,但跳过对新标识符或现有标识符的实际分配。这对于调用函数但丢弃其返回值很有用:
{{ _ := stillRuns() }} {{ _ = stillRuns() }}
由于没有实际分配发生,以上两者是等价的:
stillRuns
被执行,但返回值既不会存储在变量中,也不会被渲染(不像{{ stillRuns() }}
,它将返回值渲染到输出)。表达式
切片/数组
{{ s := slice("foo", "bar", "asd") }} {{ s[0] }} <!-- renders foo --> {{ i := 2 }} {{ s[i] }} <!-- renders asd -->
Map
{{ m := map("foo", 123, "bar", 456) }} {{ m["foo"] }} <!-- renders 123 --> {{ bar := "bar" }} {{ m[bar] }} <!-- renders 456 -->
计算
支持基本算术运算符:
+
, -
, *
, /
%
{{ 1 + 2 * 3 - 4 }} <!-- will print 3 (1+6-4) --> {{ (1 + 2) * 3 - 4.1 }} <!-- will print 4.9 -->
字符串连接
{{ "HELLO" + " " + "WORLD!" }} <!-- will print "HELLO WORLD!" -->
逻辑运算符
支持以下运算符: &&: 和 ||: 或者 !: 不是 ==: 平等的 !=: 不相等 >: 比...更棒 >=: 大于或等于(= 不小于) <: 少于 <=: 小于或等于(= 不大于)
例子
{{ item == true || !item2 && item3 != "test" }} {{ item >= 12.5 || item < 6 }} 逻辑表达式总是求值为true或false。 三元运算符 x ? y : z评估y是否x为真或z其他。 <title>{{ .HasTitle ? .Title : "Title not set" }}</title>
流程控制
IF
您可以使用以下条件根据条件在模板内部分支
if
:{{ if foo == "asd" }} foo is 'asd'! {{ end }}
else
您可以
else
在使用时提供一个块if
:{{ if foo == "asd" }} foo is 'asd'! {{ else }} foo is something else! {{ end }}
if / else if
您可以使用以下方法测试另一个条件
else if
:{{ if foo == "asd" }} foo is 'asd'! {{ else if foo == 4711 }} foo is 4711! {{ end }}
这与这段代码完全相同:
{{ if foo == "asd" }} foo is 'asd'! {{ else }} {{ if foo == 4711 }} foo is 4711! {{ end }} {{ end }}
if / else if / else
if / else if / else
当然也有效:{{ if foo == "asd" }} foo is 'asd'! {{ else if foo == 4711 }} foo is 4711! {{ else }} foo is something else! {{ end }}
并且将做与此完全相同的事情:
{{ if foo == "asd" }} foo is 'asd'! {{ else }} {{ if foo == 4711 }} foo is 4711! {{ else }} foo is something else! {{ end }} {{ end }}
range
用于range迭代数据,上下文 ( .) 设置为当前迭代的值:
{{ s := slice("foo", "bar", "asd") }} {{ range s }} {{.}} {{ end }}
切片/数组
在切片或数组上迭代时,Jet 可以为您提供当前迭代索引:
{{ range i := s }} {{i}}: {{.}} {{ end }}
如果需要,您可以让 Jet 将迭代值分配给另一个值:
{{ range i, v := s }} {{i}}: {{v}} {{ end }}
迭代值将不会用作上下文 (
.
);相反,父上下文仍然可用。Map
map 上迭代时,Jet 可以为您提供关键的当前迭代索引:
{{ m := map("foo", "bar", "asd", 123)}} {{ range k := m }} {{k}}: {{.}} {{ end }}
就像切片一样,您可以让 Jet 将迭代值分配给另一个值:
{{ range k, v := m }} {{k}}: {{v}} {{ end }}
迭代值将不会用作上下文 (
.
);相反,父上下文仍然可用。异常捕获
如果您想尝试渲染某些东西,但不希望 Jet 在出现问题时崩溃,您可以使用
try
:{{ try }} we're not sure if we already initialised foo, so the next line might fail... {{ foo }} {{ end }}
你可以在一个块中做任何你想做的事情
try
,甚至是 yield 块或包含其他模板。块内生成的所有渲染输出
try
都被缓冲,并且仅在整个块的执行成功完成后才包含在周围的输出中。任何运行时错误都意味着不会try
保留内部内容。try / catch
如果块内出现错误
try
,您可以让 Jet 评估catch
块:{{ try }} we're not sure if we already initialised foo, so the next line might fail... {{ foo }} {{ catch }} foo was not initialised, this is fallback content {{ end }}
块内发生的错误
catch
不会被捕获,并且会导致执行中止。您还可以将发生的错误分配给
catch
块内的变量以记录它或以其他方式处理它。由于它是一个 Go 错误值,您必须调用.Error()
它以获取字符串形式的错误消息。{{ try }} we're not sure if we already initialised foo, so the next line might fail... {{ foo }} {{ catch err }} {{ log(err.Error()) }} uh oh, something went wrong: {{ err.Error() }} {{ end }}
err
在catch
街区外将不可用。模板
包含模板类似于在其他模板语言中使用分部。
包含的模板中提供了所有本地和全局变量。可以通过将上下文指定为include语句中的最后一个参数来传递上下文。如果不传递上下文,则将保留当前上下文。
<!-- file: "user.jet" --> <div class="user"> {{ .["name"] }}: {{ .["email"] }} </div> <!-- file: "index.jet" --> {{ users := map( "4243", map("name", "Peter", "email", "[email protected]"), "4534", map("name", "Bob", "email", "[email protected]") ) }} {{ range users }} {{ include "./user" }} {{ end }}
输出:
<div class="user"> Peter: [email protected] </div> <div class="user"> Bob: [email protected] </div>
内置函数
为了方便起见,以下函数只是公开了 Go 标准库中的函数:
lower: 公开 Go 的strings.ToLower upper: 公开 Go 的strings.ToUpper hasPrefix: 公开 Go 的strings.HasPrefix hasSuffix: 公开 Go 的strings.HasSuffix repeat: 公开 Go 的strings.Repeat replace: 公开 Go 的strings.Replace split: 公开 Go 的strings.Split trimSpace: 公开 Go 的strings.TrimSpace html: 公开 Go 的html.EscapeString url: 公开 Go 的url.QueryEscape json: 公开 Go 的json.Marshal
len()
接受一个参数并返回字符串、数组、切片或映射的长度、结构中的字段数或通道的缓冲区大小,具体取决于参数的类型。
isset()
采用任意数量的索引、字段、链或标识符表达式,如果所有表达式的计算结果都为非零值,则返回 true。仅当传入意外的表达式类型时才会出现恐慌。
dump()
旨在帮助模板开发,可用于打印出模板可用的变量、块、上下文和全局变量。
raw()
一个完全不转义的编写器,允许您绕过 Jet 的默认 HTML 转义。谨慎使用!