1、语法基础
用 {{ }} 标记脚本代码。
用 . 访问当前上下文环境的变量、参数,例如 {{.userid}}。
用 $ 定义、访问变量, $ 访问全局上下文环境,例如:{{$ v_str := “Hello World!”}} {{$v_str}}。
用 := 给变量赋值,例如 {{ $ m_user := "蜗牛” }
注释:{{/*
注释内容
支持多行
*/}}
变量、参数、函数区分大小写。
2、输出变量、常量、函数返回值
直接输出内容:{{ 变量 参数 函数 }}
▶ 输出常量字符串: {{”Hello !"}};输出数值 {{ 100 }}
▶ 输出常量字节:{{‘A’}}
▶ 输出变量:{{.userid}}、{{$ v_str}}
▶ 输出函数返回值:{{html “Hello” " " “World!”}}
▶ 输出Model型参数:{{.user.name}}、{{$.user.name}}
通过输出函数输出:{{函数 参数…}}
▶ html:输出 html 文本内容
▶ js:输出 JS 格式内容
3、脚本控制语句
3.1、判断语句
if 语法:{{if xxx}} … {{else}} … {{end}}
▶ if 直接判断变量:{{if .userid}}、{{if $ .user}}等。
if 直接判断变量、参数,包括函数返回值
◆ 当参数变量是:fasle 或 0
◆ nil 空类型
◆ 长度为零的 数组、Model、List、字符串等
这时被判断为 假 false,否则为真 true,例如:
{{if $ .user}}
{{$.user.name}}
{{else}}
姓名未知
{{end}}
▶ if 配合逻辑函数判断
◆ if eq 等于:{{if eq 参数0 参数1 参数2 … }} {{end}},
参数0 为判断主参数,
参数0 == 参数1 OR 参数0 = 参数2 OR …,
当有一个成立便返回 ture,等同于:
{{if or (eq 参数0 参数1) (eq 参数0 参数2) …}} {{end}}
◆ if ne 不等于:{{if ne 参数1 参数2}} {{end}}
◆ if lt 小于:{{if lt 参数1 参数2}} {{end}}
◆ if le 小于等于:{{if le 参数1 参数2}} {{end}}
◆ if gt 大于:{{if gt 参数1 参数2}} {{end}}
◆ if ge 大于等于:{{if ge 参数1 参数2}} {{end}}
◆ if and 与:{{if and (表达式1) (表达式2) …}} {{end}},
逐个判断各表达式,遇到空返回该表达式值(false),
或返回最后表达式值(true)
表达式可以是 eq gt等判断函数,也可是变量。
◆ if or 或:{{if or (表达式1) (表达式2) … }} {{end}},
类似and,逐个判断,返回首个非空表达式值,
否则返回最后一个表达式值。
◆ if not 非:{{if not 表达式}} {{end}},返回表达式的否定值。
以上参数、表达式都可以包含 变量 或 函数返回值,例如 {{if eq $ v_str (FUNC_ADD 0 $v_i)}}
建议:如非必要,使用简单形式 {{if eq $ i 1}} … {{end}}
3.2、循环遍历
语法:
{{range $ idx,$ elem := $ list}}
{{/* 当 $ list 非空 或 长度大于 0 执行
$ idx 为循环变量 从 0 开始
$ elem 为元素 变量 或 Model 类型 [ id:1;name:毛豆 ]
/}}
[ {{else}} ]
{{/ else 可选 当 $ list 为空 或 长度为 0 执行 */}}
{{end}}
$list为数组时,直接遍历数组的值。
{{range $ i,$ v:=.user}}
No{{$ i}}:{{$ v}}
{{end}}
{{range}} 可以嵌套。
3.3、with结构
语法:
{{with 变量 或 赋值语句}}
…
[ {{else}} ]
{{/* else 可选 当 变量 为空 长度为 0 执行 */}}
{{end}}
▶ 变量为 Model
{{with . user}}
{{. name}}
{{else}}
{{/* . user 为空 */}}
{{end}}
▶ with 赋值语句
{{with $val := "Today is : %s}}
{{printf . “2021-07-01”}}
{{end}}
printf . 中的点 等同 $val。
4、作用域
4.1、局部变量作用域
if、range、with 段内是局部变量的作用域范围,其中定义的变量只在段有效,例如:
{{if .user}}
{{$ v1 := 10}}
{{$ v1}} {{/* = 10 */}}
{{end}}
{{if eq $v1 10}} {{/* $v1 无效 ,返回: undefined variable $v1 错误 */}}
YES!
{{end}}
4.2、全局变量作用域
全局变量的引用需要加前缀 $,例如:定义页面参数 user。
全局变量在 if、 range、 with 段内修改,只在段内有效,定义全局变量{{g_var:=100}}
▶ if 段内权局变量
if 段内引用权局变量,可以不加 $ 前缀:
{{if .user}}
姓名:{{.user.name}} {{/* 如此使用符合规则 ,建议也加 前缀 $ /}}
{{$ g_var := 999}}
g_var :{{$ g_var}} {{/ 得到 999 /}}
{{end}}
g_var :{{$ g_var}} {{/ 得到 111 */}}
▶ range 段内权局变量
range 段内引用根全局变量(非当前上下文全局变量),需要在 . 前加 $
{{range $ idx,$ elem := $ list}}
姓名:{{.user.name}} {{/* 这样引用 虽然不返回错误,但无法取得 name 的值 /}}
{{$ g_var := 999}}
g_var :{{ $ g_var}} {{/ 得到 999 /}}
{{end}}
g_var :{{$ g_var}} {{/ 得到 111 */}}
▶ with 段内权局变量
with 段内引用根全局变量(非当前上下文全局变量),必需在 . 前加 $ ,否则会引发异常。
{{with $ val := "Today is : % s }}
{{printf . .user.birthday}} {{/* 引发异常 /}}
{{$ g_var := 999}}
g_var :{{$ g_var}} {{/ 得到 999 /}}
{{end}}
g_var :{{$ g_var}} {{/ 得到 111 */}}
转载请著名出处