第三章-模板语法

第一节  模板语法一

源代码路径: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}}

注意:是左闭右开区间

 

posted @ 2022-12-21 18:58  羊脂玉净瓶  阅读(26)  评论(0)    收藏  举报