第三章-模板语法
第一节 模板语法一
源代码路径:chapter03\test_syntax_tpl.go
模板路径:template\chapter03\test.html
一、统一使用了 { { 和 } } 作为左右标签
二、上下文
- . 访问当前位置的上下文
- $ 引用当前模板根级的上下文
- $. 引用模板中的根级上下文
三、支持go语言的符号,这里只是符号的支持
1.字符串:{ { “zhiliao ” } }
2.原始字符串:{ { `zhiliao` } } 不会转义
3.字节类型:{ { ' a' } } -->97 ascll码对应表: http://ascii.911cha.com/
4.nil类型:{ { print nil } } { {nil } }只有nil会报错:nil is not a command
四、定义变量
1.定义:
{{$username := "xxxx"}}
2.使用:
{{$username }}
注意:只能在当前模板中使用
五、pipline
1.可以是上下文的变量输出,也可以是函数通过管道传递的返回值
e.g.
- { {.Name} } 是上下文的变量输出,是个pipline
- { { "hallen" | len } } 是函数通过管道传递的返回值,是个pipline
六、if
1.if...else
{{if .name}}
有姓名
{{else}}
没有姓名
{{end}}
2.if嵌套
成年人而且带了身份证的准进:
{{if .A}}
{{if .C }}
可以进
{{else}}
不能进
{{end}}
{{else}}
未成年不能进
{{end}}
七、range
第一种:
{{range $v := .arr_struct}}
{{$v.Name}}
{{$v.Age}}
{{$v.Gender}}
{{end}}
下面的也可以
{{range $v := .arr}}
{{/*{{$v}}*/}}
{{.}}
{{end}}
第二种:
{{ range .arr_struct }}
{{.Name }}
{{.Age}}
{{ $.total}} // 使用 $. 引用模板中的根级上下文
{{end}}
range也支持else,当长度为0时,执行else
{{range .total}}
{{.}}
{{else}}
{{ 0 }} {{/* 当 .total 为空 或者 长度为 0 时会执行这里 */}}
{{end}}
第二节 模板语法二
一、with:伴随
1.作用:用于重定向 pipeline
2.使用
{{with .user}}
{{.Id}}
{{.Name}}
{{end}}
不用每个字段前面都加user.了
3.支持else,当长度为0时,显示else中的数据
{{with .user}}
{{.Id}}
{{.Name}}
{{else}}
暂无数据
{{end}}
场景:登录的用户显示用户名,没有登录的用户显示"游客"
二、template
1.作用:引入另一个模板文件,对于模板的分模块处理很有用处,
2.使用:{ {template "模板名" pipeline} }
e.g.
{{template "user/test.html" .}}
注意:
- 引入的模板文件中也要用{ {define "user/test.html"} } { {end} }包含
- 如果想在引入的模板中也需要获取动态数据,必须使用.访问当前位置的上下文
三、注释
允许多行文本注释,不允许嵌套
{{/* comment content
support new line */}}
{{/*
这是模板块注释
这是模板块注释
这是模板块注释
这是模板块注释
*/}}
第三节 模板函数
源代码路径:chapter03\test_func_tpl.go
模板路径:template\chapter03\terst_func_tpl.html
一、print
print:对应 fmt.Sprint
printf:对应 fmt.Sprintf
println:对应 fmt.Sprintln
{{print "hallen"}}
格式化输出:
-
%c:字符型,可以把输入的数字按照ASCII码相应转换为对应的字符
-
%d:一个十进制数值,基数为10
-
%f:以标准计数法表示的浮点数或者复数值
-
%s:字符串。输出字符串中的字符直至字符串中的空字符(字符串以'\0'结尾,这个'\0'即空字符)
-
%t:以true或者false输出的布尔值
-
%T:查看类型
-
%v:自动匹配类型输出,适用于大多数类型
fmt.Sprint和fmt.Print的区别:
- Print有打印,Sprint没有打印,但是可以返回结果
二、管道符
变量可以使用符号 | 在函数间传递
{{.Name | printf "%s"}}
三、括号 优先级
{{printf "nums is %s %d" (printf "%d %d" 1 2) 3}}
{{printf "name:%s,addr:%s" "hallen" (printf "%s-%s" "北京市" "西城区")}}
四、and
1.作用:只要有一个为空,则整体为空,如果都不为空,则返回最后一个
2.使用:
{{and .X .Y .Z}}
五、or
1.作用:只要有一个不为空,则返回第一个不为空的,否则返回空
2.使用:
{{or .X .Y .Z}}
六、call(看自定义模板函数)
1.作用:可以调用函数,并传入参数
2.使用:
{{call .Field .Arg1 .Arg2}}
七、index
1.作用:读取指定类型对应下标的值
2.支持 map, slice, array, string
e.g.
数据准备:
arr := []int{1,2,3,4,5}
message := map[string]interface{}{
"arr":arr,
"name":map[string]interface{}{"name":"xx111","age":18},
}
使用:
{{index .name "name"}}
{{index .arr 1}}
注意:数组的角标从0开始的
八、len
1.作用:返回对应类型的长度
2.支持类型:map, slice, array, string, chan
e.g.
{{.arr | len}}
九、not
1.作用:返回输入参数的否定值
2.使用
{{not .arr1}}
十、urlquery
1.作用:有些符号在URL中是不能直接传递的,如果要在URL中传递这些特殊符号,那么就要使用他们的编码了。
2.使用
{{urlquery "http://www.baidu.com"}}
结果:http%3A%2F%2Fwww.baidu.com
% 后面的就是字符的16进制的字符码
十一、eq / ne / lt / le / gt / ge
1.eq:等于
2.ne:不等于
3.lt:小于 less
4.le:小于等于
5.gt:大于 greater
6.ge:大于等于
{{eq .num 18}}
{{ne .num 17}}
{{lt .num 16}}
{{le .num 18}}
{{gt .num 18}}
{{ge .num 18}}
eq 和其他函数不一样的地方是,支持多个参数
{{eq .num 10 11 17 18}}
第四节 模板函数二
一、Format
1.实现了时间的格式化,返回字符串,也可以在后端转好,前端直接使用
2.使用方法
-
使用方法 { {.time_data.Format "2006/01/02 15:04:05"} }
-
设置时间格式比较特殊,需要按如下方式,一定不能变
-
"2006/01/02 15:04:05"
-
貌似是GO的诞生的时间
-
-
和go语言的使用方法类似
-
now := time.Now().Format("2006/01/02 15:04:05")
二、html
1.作用:转义文本中的html标签
如将“<”转义为“<”,“>”转义为“>”等
三、js
1.作用:返回用JavaScript的escape处理后的文本
escape函数可对字符串进行编码,这样就可以在所有的计算机上读取该字符串
可以使用unescape解吗
{{js "<script>xx</script>"}}
结果:\x3Cscript\x3Exx\x3C/script\x3E
模板函数整理
var builtins = FuncMap { "and": and, "call": call, "html": HTMLEscaper, "index": index, "js": JSEscaper, "len": length, "not": not, "or": or, "print": fmt.Sprint, "printf": fmt.Sprintf, "println": fmt.Sprintln, "urlquery": URLQueryEscaper, // Comparisons "eq": eq, // == "ge": ge, // >= "gt": gt, // > "le": le, // <= "lt": lt, // < "ne": ne, // != }
第五节 自定义模板函数
一、定义函数
func SubStr(str string,l int) string {
ret := str[0:l]
return (ret + "...")
}
二、SetFuncMap
engine.SetFuncMap(template.FuncMap{
"SubStr": SubStr, // 字符串名称是前端使用的名称
})
三、前端使用
{{SubStr "qwertyuu" 3}}
注意:是左闭右开区间