GoLang 基础组件 template

简单使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
type WebPage struct {
Name string
Href string
Icon string
Desc string
Next []WebPage
Category []WebPage
}

var webpageTpl = `
[webpage]
{{range $index, $n := .webpage}}
{{$index}}.{{$.Name}} {{.Desc}}
{{end}}`

data := []WebPage{
{
Name: "w1",
Next: []WebPage{
{Name: "w12"}
}
}, {
Name: "w2",
Next: []WebPage{
{Name: "w22"}
}
}
}
tmpl, err := template.New("main").Parse(webpageTpl)
var buf bytes.Buffer
tmpl.Execute(&buf, data)
fmt.Println(buf.String())

函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
var webpageTpl = `
[webpage]
{{range $index, $n := .webpage}}
{{ if isStart $index }}
{{$index}}.{{$.Name}} {{.Desc}}
{{end}}
{{end}}
`

data := []WebPage{
{
Name: "w1",
Next: []WebPage{
{Name: "w12"}
}
}, {
Name: "w2",
Next: []WebPage{
{Name: "w22"}
}
}
}


tmpl, err := template.New("main").Funcs(
template.FuncMap{
"isStart": func (i int) bool {
return i == 0
}
}
).Parse(webpageTpl)
var buf bytes.Buffer
tmpl.Execute(&buf, data)
fmt.Println(buf.String())
1
2
3
4
5
{{FuncName}} // FuncName()
{{FuncName "Arg1" "Arg2"}} // FuncName("Arg1", "Arg2")
{{.Arg | FuncName}} // FuncName(.Arg)

{{call FuncName Arg1}} // FuncName(Arg1)

基础语法

1
2
3
4
5
6
7
{{/* 注释 */}}
// 输出当前对象值
{{.}}
{{.Name}}
// 定义变量
{{$x := "OK"}}
{{$x := pipeline}}

条件判断

1
2
3
{{if pipeline}} T1 {{end}}
{{if pipeline}} T1 {{else}} T0 {{end}}
{{if pipeline}} T1 {{else if pipeline}} T0 {{end}}

循环遍历

1
2
3
{{range $k, $v := .Var}} {{$k}} => {{$v}} {{end}}
{{range .Var}} {{.}} {{end}}
{{range pipeline}} T1 {{else}} T0 {{end}}

输出字符串

1
2
3
4
5
{{"put" | printf "%s%s" "out" | printf "%q"}} // printf("%q", printf("%s%s", "out", "put"))
print
printf
println
分别等价于fmt包中的Sprint、Sprintf、Sprintln

条件判断

1
2
3
4
5
6
7
8
9
10
eq arg1 arg2 // arg1 == arg2
ne arg1 arg2 // arg1 != arg2
lt arg1 arg2 // arg1 < arg2
le arg1 arg2 // arg1 <= arg2
gt arg1 arg2 // arg1 > arg2
ge arg1 arg2 // arg1 >= arg2

// 如果传入多个参数的话 比较的规则是
// arg1==arg2 || arg1==arg3 || arg1==arg4 ...

其他内置的一些函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
len
返回参数的length。

index
对可索引对象进行索引取值。第一个参数是索引对象,后面的参数是索引位。
"index x 1 2 3"代表的是x[1][2][3]。
可索引对象包括map、slice、array。

call
显式调用函数。第一个参数必须是函数类型,且不是template中的函数,而是外部函数。
例如一个struct中的某个字段是func类型的。
"call .X.Y 1 2"表示调用dot.X.Y(1, 2),Y必须是func类型,函数参数是1和2。
函数必须只能有一个或2个返回值,如果有第二个返回值,则必须为error类型。

and
返回第一个为空的参数或最后一个参数。可以有任意多个参数。
and x y等价于if x then y else x

not
布尔取反。只能一个参数。

or
返回第一个不为空的参数或最后一个参数。可以有任意多个参数。
"or x y"等价于"if x then x else y"

不转义

需要将不转义的变量进行类型转换

1
2
3
4
type CSS
type HTML
type JS
type URL

模板继承

1
2
{{template "name"}}
{{template "name" pipeline}}
1
2
3
4
5
6
7
8
9
10
11
func main() {
t1 := template.New("test1")
tmpl, _ := t1.Parse(
`{{- define "T1"}}ONE {{println .}}{{end}}
{{- define "T2"}}TWO {{println .}}{{end}}
{{- define "T3"}}{{template "T1"}}{{template "T2" "haha"}}{{end}}
{{- template "T3" -}}`)
_ = tmpl.Execute(os.Stdout, "hello world")
}
// ONE <nil>
// TWO haha
1
2
// 先查找 template 为 T1 的模板,没有则定义一个
{{block "T1" .}} one {{end}}