🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
* ### 模板标签 go 统一使用了 { { 和 } } 作为左右标签,可以修改为其他的符号 `beego.BConfig.WebConfig.TemplateLeft = "(("` ` beego.BConfig.WebConfig.TemplateRight = "))"` 但,我们不建议修改,因为系统推荐了的是最优方案。 * ## 基本语法 ``` * #### 使用`.`来访问当前位置的上下文 * #### 使用`$`来引用当前模板根级的上下文 * #### 使用 $. 引用模板中的根级上下文 ``` ***** * ## 支持go语言的符号,这里只是符号的支持 ``` * #### 字符串:{ { “zhiliao ” } } * #### 原始字符串:{ { `\\zhiliao` } } 不会转义 * #### 字节类型:{ { ' a' } } --\>97 * #### nil:{ { print nil } } { {nil } }只有nil会报错:nil is not a command ``` * ## pipeline:可以是上下文的变量输出,也可以是函数通过管道传递的返回值 ``` * #### { } 是上下文的变量输出,是个pipline * #### { { "0000" | len } } 是函数通过管道传递的返回值,是个pipline * #### pipeline 被认为是空的情况,当 pipeline 的值等于: * #### false 或 0 * #### nil 的指针或 interface * #### 长度为 0 的 array, slice, map, string ``` * ## if的使用 ``` * ## if ... end * ## if ... else ... end ``` * ## 嵌套使用 ~~~ 男的成年人准进: ​ {{if .A}}   {{if .C }}       可以进   {{else}}       女不能进   {{end}} {{else}}   未成年不能进 {{end}} ~~~ ## * ## range:对应的内部长度为0时,不会执行,也就是数据为空 * #### 使用 $. 引用模板中的根级上下文 ~~~ 结构体: type student struct { Name string Age int Gender string } 赋值: arr_struct := [3]student{ {Name:"hl",Age:18,Gender:"男"},{Name:"hallen",Age:19,Gender:"男"},{Name:"hallen1",Age:191,Gender:"男"} } c.Data["arr_struct"] = arr_struct c.Data["total"] = 100 ​ 前端获取:先循环数组,在获取结构体变量,注意是大写 {{range $v := .arr_struct}} {{$v.Name}} {{$v.Age}} {{$v.Gender}} 第二种: {{ range .arr_struct }} {{.Name }} {{.Age}} {{ $.total}} // 使用 $. 引用模板中的根级上下文 {{end}} ~~~ * #### range也支持else ~~~ {{range .total}} {{else}}   {{ 0 }}                 {{/* 当 .total 为空 或者 长度为 0 时会执行这里 */}} {{end}} ~~~ * ## with:伴随 #### 用于重定向 pipeline ``` {{.struct_data.Name}} {{.struct_data.Age}} {{.struct_data.Add}} ``` 以上代码中,如果数据多,每次都要写.struct_data.太麻烦,所以我们要用with。实例如下 ~~~ {{with .struct_data}}   {{.Name}} {{end}} ​ ​ 类似于: {{.struct_data.Name}} ~~~ #### with也支持else 如果值存在就显示值,不存在就显示无 ~~~ {{with .struct_data1}} {{.Name}} {{else}} 无 {{end}} ~~~ * ## template:对于模板的分模块处理很有用处,引入另一个模板文件 #### { {template "模板名" pipeline} } ` { {template "bottom.html"} }` #### 支持直接载入模板文件 * #### { {template "bottom.html" .} } * 注意:** 如果引入的文件也需要获取动态数据,那{ {template "bottom.html" .} }中必须使用.访问当前位置的上下文** * ## define:可以用来定义自模板,可用于模块定义和模板嵌套 ## 定义自己的模板 首先,在视图文件中定义自己的代码块,取名为loop,如下: ~~~ {{define "loop"}} <li>{{.Name}}</li> {{end}} ~~~ 其次在 template调用自定义的模板块或代码块,**如果使用动态数据,得加 `"." ` 上下文** ` {{template "loop" .}}` ~~~ <ul> {{range .Items}}     {{template "loop" .}}         {{end}} </ul> ~~~ ## 注释:允许多行文本注释,不允许嵌套 ~~~ {{/* comment content support new line */}} ~~~ * ## 格式化输出 * ## print:对应 fmt.Sprint * ## printf:对应 fmt.Sprintf * ## println:对应 fmt.Sprintln ***** #### %c:字符型,可以把输入的数字按照ASCII码相应转换为对应的字符 #### %d:一个十进制数值,基数为10 #### %f:以标准计数法表示的浮点数或者复数值 #### fmt.Printf("%.2f\\n",1.23321) #### .%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} }` * ## and: * #### 会逐一判断每个参数,将返回第一个为空的参数,否则就返回最后一个非空参数 * #### { {and .X .Y .Z} } * #### 只要有一个为空,则整体为空,如果都不为空,则返回最后一个 * ## or: * #### 会逐一判断每个参数,将返回第一个非空的参数,否则就返回最后一个参数 * #### { {or .X .Y .Z} } * #### 只要有一个不为空,则返回第一个不为空的,否则返回空 * ## call:可以调用函数,并传入参数 若在前端生成一个函数 ``` c.Data["myfunc_data"]=MyFunc //调用以下的自定义函数,不能加()。 Function MyFunc() string{ return "This is my Function" } ``` 在模板中这样调用 ``` { {call .myfunc_data} } ``` * #### { {call .Field .Arg1 .Arg2} } * #### 调用的函数需要返回 1 个值 或者 2 个值,返回两个值时,第二个值用于返回 error 类型的错误。返回的错误不等于 nil 时,执行将终止。 * ## index:读取指定类型对应下标的值 * ### 支持 map, slice, array, string * 如果是map获取指定数据中key的值;如果是字符串和数组是角标arr[0](0,1...)指定的值。 * 中文汉字用角标取值会显示Asc值。 * ##### this.Data\["Maps"\] = map\[string\]string{"name": "Beego"} * ##### { {index .Maps "name"} } * ## len:返回对应类型的长度 * #### 支持类型:map, slice, array, string, chan * #### { { .Content|len } } * ## not:返回输入参数的否定值,也就是取反。true -> false * `{{not 1}}`值为false * ## urlquery: * #### 有些符号在URL中是不能直接传递的,如果要在URL中传递这些特殊符号,那么就要使用他们的编码了。 * #### `urlquery "http://www.baidu.com"` 转码后返回:http%3A%2F%2F[www.baidu.com](www.baidu.com) * #### %后面的就是字符的16近制的字符码 * ## eq / ne / lt / le / gt / ge * #### eq:等于 * #### ne:不等于 * #### lt:小于 * #### le:小于等于 区别于lte * #### gt:大于 * #### ge:大于等于 区别于gte * #### eq 和其他函数不一样的地方是,支持多个参数,和下面的逻辑判断相同 100是否小于200 ``` * #### { {if eq true .Var1 .Var2 .Var3} }{ {end} } * #### { {if lt 100 200} }{ {end} } ```