暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Go语言中使模板引擎的语法

红牛编程 2018-11-15
233

1 模板界定符2 数据3 调用函数4 管道5 条件分支6 循环遍历7 解析子模板8 定义模板变量9 注释

1 模板界定符

{{ }}

是默认的模板界定符。用于在 HTML 模板文件中界定模板语法。例如:

Hello, {{ .User }}
<br>
你熟悉的技术:
<ul>
{{ range .List }}
    <li>{{.}}</li>
{{end}}
</ul>

若需要使用自定义的界定符,使用 func (t *Template) Delims(left, right string) *Template
方法进行定义。后续的解析会识别新定义的界定符。

2 数据

分配到模板中的数据使用 .
点可以访问。点会随着所处的上下文变化而变化,例如上面的例子,在 range
内就表示所遍历的每个数据,而在 range
外,就表示分配到模板中的数据整体。

解析数据时,默认会被 HTML 实体编码,防止 XSS 攻击。若需要原样输出,需要将数据转换为 template.HTML
类型,例如:

t.Execute(w, `<script>alert("Hack")</script>`)
// 解析结果: &lt;script&gt;alert(&#34;Hack&#34;)&lt;/script&gt;

t.Execute(w, template.HTML(`<script>alert("Hack")</script>`))
// 解析结果: <script>alert("Hack")</script>

甚至在不同的 HTML 语法上下文中,会有不同的编码方式,例如:

假设 .
的值为 Hank's 博客
:

a href="{{.}}" 中,会进行 URL 编码,结果为:Hank%27s%20%e5%8d%9a%e5%ae%a2
a title="{{.}}" 中,会进行 ASCII 实体编码,结果为:Hank&#39;s 博客

3 调用函数

{{FuncName1 "参数值1" "参数值2"}}

函数支持模板函数,和全局函数。预定义的全局函数为:

  • and,返回第一个 empty参数或者最后一个参数。即 and x y
    等价于 if x then y else x
    ,所有参数都会执行

  • or,返回第一个非 empty 参数或者最后一个参数。即 or x y
    等价于 if x then x else y
    ,所有参数都会执行

  • not,返回它的单个参数的布尔值的否定

  • len,返回它的参数的整数类型长度

  • index,返回第一个参数以剩下的参数为索引/键指向的值,index x 1 2 3
    返回 x[1][2][3]
    的值;每个被索引的主体必须是数组、切片或者字典。

  • print,即 fmt.Sprint

  • printf,即 fmt.Sprintf

  • println,即 fmt.Sprintln

  • html,返回参数的 HTML 实体编码

  • urlquery,返回参数的 URL 编码

  • js,返回参数的 JavaScript 编码

4 管道

可以在变量后使用 | (管道符),将其值作为参数传递给函数,并得到函数的返回值。管道可以连续使用,演示为:

// . 为 `Hank's 博客`
{{.|urlquery}}
// Hank%27s+%E5%8D%9A%E5%AE%A2

5 条件分支

{{if pipeline}} T1 {{ else if pipeline}} T2 {{else}} T3 {{end}}

若 pipeline 的值不为 empty,条件匹配,执行相应分支。

empty 空值为:false、0、任意nil指针或者nil接口,任意长度为0的数组、切片、字典。

6 循环遍历

{{range pipeline}} T1 {{else}} T0 {{end}}

{{range $index, $element := pipeline}} T1 {{end}}

遍历数组、切片、字典或者通道的每一个成员元素并执行 T1。
若 pipeline 为空,执行 T0。else 分支可以省略。
empty 空值为:false、0、任意nil指针或者nil接口,任意长度为0的数组、切片、字典。

若需要同时获取下标和值,需要使用变量赋值语法。

7 解析子模板

{{template "name" pipeline}}

解析名为 name 的模板,提供给模板的参数为 pipeline。

8 定义模板变量

{{$variable := pipeline}}

9 注释

{{/* a comment */}}

完!
原文出自:小韩说课
微信关注:小韩说课

小韩说课
文章转载自红牛编程,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论