一、基本語法
go統一使用{{和}}作為左右標簽,沒有其它的標簽符號。
使用"."來訪問當前位置的上下文,使用"$"來引用當前模板根級的上下文,使用$var來訪問創建的變量。
1.模板中支持的go語言符號
{{"string"}} // 一般 string
{{`raw string`}} // 原始 string
{{‘c‘}} // byte
{{print nil}} // nil 也被支持
2.模板中的pipeline(管道)
可以是上下文的變量輸出,也可以是函數通過管道傳遞的返回值。
{{. | FuncA | FuncB | FuncC}}
當pipeline的值等於:
- false或0
- nil的指針或interface
- 長度為0的array、slice、map、string
那么這個pipeline被認為是空。
3.邏輯處理
(1)if...else...end
{{if pipeline}}{{end}}
if判斷時,pipeline為空時,相當於判斷為False
this.Data["IsLogin"] = true this.Data["IsHome"] = true this.Data["IsAbout"] = true
支持嵌套的循環
{{if .IsHome}}
{{else}}
{{if .IsAbout}}{{end}}
{{end}}
也可以使用else if進行
{{if .IsHome}}
{{else if .IsAbout}}
{{else}}
{{end}}
(2)range...end 內循環
{{range pipeline}}{{.}}{{end}}
pipeline 支持的類型為 array, slice, map, channel
range 循環內部的 . 改變為以上類型的子元素
對應的值長度為 0 時,range 不會執行,. 不會改變
pages := []struct {
Num int
}{{10}, {20}, {30}}
this.Data["Total"] = 100
this.Data["Pages"] = pages
使用 .Num 輸出子元素的 Num 屬性,使用 $. 引用模板中的根級上下文
{{range .Pages}}
{{.Num}} of {{$.Total}}
{{end}}
使用創建的變量,在這里和 go 中的 range 用法是相同的。
{{range $index, $elem := .Pages}}
{{$index}} - {{$elem.Num}} - {{.Num}} of {{$.Total}}
{{end}}
range 也支持 else
{{range .Pages}}
{{else}}
{{/* 當 .Pages 為空 或者 長度為 0 時會執行這里 */}}
{{end}}
(3)with...end
{{with pipeline}}{{end}}
with 用於重定向 pipeline
{{with .Field.NestField.SubField}}
{{.Var}}
{{end}}
也可以對變量賦值操作
{{with $value := "My name is %s"}}
{{printf . "slene"}}
{{end}}
with 也支持 else
{{with pipeline}}
{{else}}
{{/* 當 pipeline 為空時會執行這里 */}}
{{end}}
(4)define
define 可以用來定義自模板,可用於模塊定義和模板嵌套
{{define "loop"}}
<li>{{.Name}}</li>
{{end}}
使用 template 調用模板
<ul>
{{range .Items}}
{{template "loop" .}}
{{end}}
</ul>
(5)template
{{template "模板名" pipeline}}
將對應的上下文 pipeline 傳給模板,才可以在模板中調用
3.beego中支持直接載入文件模板
{{template "path/to/head.html" .}}
Beego 會依據你設置的模板路徑讀取 head.html
在模板中可以接着載入其他模板,對於模板的分模塊處理很有用處
4.注釋
允許多行文本注釋,不允許嵌套
{{/* comment content
support new line */}}
二、基本函數
變量可以使用符號|在函數間傳遞
{{.Con | markdown | addlinks}}
{{.Name | printf "%s"}}
使用括號
{{printf "nums is %s %d" (printf "%d %d" 1 2) 3}}
(1)and
{{and .X .Y .Z}}
and 會逐一判斷每個參數,將返回第一個為空的參數,否則就返回最后一個非空參數
(2)call
{{call .Field.Func .Arg1 .Arg2}}
call 可以調用函數,並傳入參數
調用的函數需要返回 1 個值 或者 2 個值,返回兩個值時,第二個值用於返回 error 類型的錯誤。返回的錯誤不等於 nil 時,執行將終止。
(3)index
index 支持 map, slice, array, string,讀取指定類型對應下標的值
this.Data["Maps"] = map[string]string{"name": "Beego"}
{{index .Maps "name"}}
(4)len
{{printf "The content length is %d" (.Content|len)}}
返回對應類型的長度,支持類型:map, slice, array, string, chan
(5)not
not 返回輸入參數的否定值,if true then false else true
(6)or
{{or .X .Y .Z}}
or 會逐一判斷每個參數,將返回第一個非空的參數,否則就返回最后一個參數
(7)print
對應 fmt.Sprint
(8)printf
對應fmt.Sprintf
(9)pfintln
對應fmt.Sprintf
(10)urlquery
{{urlquery "http://beego.me"}}
將返回
http%3A%2F%2Fbeego.me
(11)eq / ne / lt / le / gt / ge
這類函數一般配合在 if 中使用
eq: arg1 == arg2ne: arg1 != arg2lt: arg1 < arg2le: arg1 <= arg2gt: arg1 > arg2ge: arg1 >= arg2
eq 和其他函數不一樣的地方是,支持多個參數,和下面的邏輯判斷相同
arg1==arg2 || arg1==arg3 || arg1==arg4 ...
與 if 一起使用
{{if eq true .Var1 .Var2 .Var3}}{{end}}
{{if lt 100 200}}{{end}}
