golang 模板常用语法
1、变量赋值
Action里可以初始化一个变量来捕获管道的执行结果。初始化语法如下:
其中$variable是变量的名字。声明变量的action不会产生任何输出。
{{$variable := pipeline}}
福利彩蛋:没有好玩的 API 接口?上百款免费接口等你来,免费 API,免费 API 大全
2、range
循环切片数组等
如果"range" action初始化了1个变量,该变量设置为迭代器的每一个成员元素,如果初始化了逗号分隔的2个变量:
这时, k e y 和 key和 key和val分别设置为数组/切片的索引或者字典的键,以及对应的成员元素。注意这和go range从句只有一个参数时设置为索引/键不同!
// 这里的val是每一个元素,不是索引
{{range $val := .data}}
{{end}}
{{range $key,$val := .data}}
{{end}}
一个变量的作用域只到声明它的控制结构(“if”、“with”、“range”)的"end"为止,如果不是在控制结构里声明会直到模板结束为止。子模板的调用不会从调用它的位置(作用域)继承变量。
模板开始执行时,$会设置为传递给Execute方法的参数,就是说,dot的初始值。
3、输出原始字符串
下面是一些单行模板,展示了pipeline和变量。所有都生成加引号的单词"output":
{{"\"output\""}}
字符串常量
{{`"output"`}}
原始字符串常量
{{printf "%q" "output"}}
函数调用
{{"output" | printf "%q"}}
函数调用,最后一个参数来自前一个command的返回值
{{printf "%q" (print "out" "put")}}
加括号的参数
{{"put" | printf "%s%s" "out" | printf "%q"}}
玩出花的管道的链式调用
{{"output" | printf "%s" | printf "%q"}}
管道的链式调用
{{with "output"}}{{printf "%q" .}}{{end}}
使用dot的with action
{{with $x := "output" | printf "%q"}}{{$x}}{{end}}
创建并使用变量的with action
{{with $x := "output"}}{{printf "%q" $x}}{{end}}
将变量使用在另一个action的with action
{{with $x := "output"}}{{$x | printf "%q"}}{{end}}
以管道形式将变量使用在另一个action的with action
4、模板自定义方法添加
自定义方法添加一定要在ParseFiles解析之前,因为解析的时候同时会校验模板文件里的方法和语法
初始化有多种方法:
1、初始化空模板
如果初始化的是空模板的话,最后在执行的时候必须调用ExecuteTemplate方法,同时指定解析的模板名称(只要模板名称即可)
t := template.New("")
t = t.Funcs(template.FuncMap{"formatStr": formatStr})
t, err = t.ParseFiles("view/demo.html")
err = t.ExecuteTemplate(w, "demo.html", p)
2、初始化解析模板
如果初始化的是解析模板的话,最后在执行的时候可以调用ExecuteTemplate方法,同时指定解析的模板名称(只要模板名称即可)或Execute方法都行
t := template.New("demo.html")
t = t.Funcs(template.FuncMap{"formatStr": formatStr})
t, err = t.ParseFiles("view/demo.html")
//err = t.ExecuteTemplate(w, "demo.html", p)
// 或
err = t.Execute(w, p)
3、嵌套模板自定义方法
一般情况页面都指多模板嵌套显示:所以这种情况下New和ExecuteTemplate里面的模板名称需要是最父级的模板文件,如下的layout.html
t := template.New("layout.html")
t = t.Funcs(template.FuncMap{"formatStr": formatStr})
t, err = t.ParseFiles([]string{
"view/layout.html",
"view/header.html",
"view/demo.html",
"view/footer.html",
}...)
//err = t.ExecuteTemplate(w, "layout.html", p)
// 或
err = t.Execute(w, p)