go html template
前言:
在一些前后端不分离的Web架构中,我们通常需要在后端将一些数据渲染到HTML文档中,从而实现动态的网页(网页的布局和样式大致一样,但展示的内容并不一样)效果。
正文:
模板文件通常定义为.tmpl和.tpl为后缀(也可以使用其他的后缀.html,.htm)
模板文件中使用{{和}}包裹和标识需要传入的数据
模板使用文档:https://go-zh.org/pkg/html/template/
模板语法:
{{.}}
模板语法都包含在{{和}}之间,其中{{.}}中的点表示当前对象。
在template中,点 . 表示当前作用域的当前对象
template 实例1:简单的加载模板实例
import ( "fmt" "html/template" "net/http" "os" ) func index(w http.ResponseWriter, r *http.Request) { //解析模板文件 temp, err := template.ParseFiles("template/index.tpl") //解析html内容 //temp, err := template.New("test").Parse("<h1>{{.}}</h1>") if err != nil { fmt.Println("err:", err) } //输出到浏览器 temp.Execute(w, "hello template") //输出到控制台 //temp.Execute(os.Stdout, "hello template") } main: http.HandleFunc("/index", index) http.ListenAndServe("127.0.0.1:80", nil) index.tpl template: go template<br /> {{.}}
template 实例2:模板加载map数据实例
func index(w http.ResponseWriter, r *http.Request) { //解析模板文件 temp, err := template.ParseFiles("template/index.tpl") //解析html内容 //temp, err := template.New("test").Parse("<h1>{{.}}</h1>") if err != nil { fmt.Println("err:", err) } user := make(map[string]string) user["name"] = "lampol" user["email"] = "5644645633@qq.com" //输出到浏览器 temp.Execute(w, user) //输出到控制台 //temp.Execute(os.Stdout, "hello template") } main: http.HandleFunc("/index", index) http.ListenAndServe("127.0.0.1:80", nil) template: <p>{{.}}</p> <p>name: {{.name}}</p> <p>email:{{.email}}</p> <p>输出文本:{{"hello world!"}}</p> <p>注释:{{/* "hello world!" */}}</p> <p>去除空格: 11 {{- "22" -}} 33</p>
模板管道
pipeline是指产生数据的操作,可以使用管道符号|链接多个命令,
用法和unix下的管道类似:|前面的命令将运算结果(或返回值)传递给后一个命令的最后一个位置
<p>{{ . | println "hello" }} </p>
<p>{{ . | len }} </p>
print printf println 分别等价于fmt包中的Sprint、Sprintf、Sprintln
管道实例1:管道在html模板中使用
<p>使用管道| println: {{.name | println "hello"}} </p>
<p>使用管道| len: {{.name | len}} </p>
<p>声明变量 $len: {{ $len := len .name}} </p>
<p>调用变量 $len: {{ $len}} </p>
模板中if判断
注意 关系表达式 要放在前面 (eq, nt,lt,gt,ge,le,ne)
{{ if gt .age 33 }}
<p>年龄大于33</p>
{{ else if lt .age 33 }}
<p>年龄小于33</p>
{{ end }}
模板中循环的使用
range循环:
<p>range 循环</p>
{{ range $k,$v := .}}
<p>{{$k}} ====== {{$v}}</p>
{{end}}
with内置函数:
with 用来设置 . 的值
{{with "hello"}}
<p>{{.}}</p>
{{end}}
输出 hello
{{with .name}}
<p>with: {{.}}</p>
{{end}}
输出 .name的值
内置函数:
not 非
and 与
or 或
eq 等于
ne 不等于
lt 小于
le 小于等于
gt 大于
ge 大于等于
内置函数实例:
{{ if and .isLogin .isVip}}
<p>登录成功 并且是 VIP</p>
{{end}}
{{ if or .isLogin .isVip}}
<p>登录成功 或者是 VIP</p>
{{end}}
{{ if not .isLogin}}
<p>登录失败</p>
{{else}}
<p>登录成功</p>
{{end}}
模板自定义函数
Go的模板支持自定义函数。需要注意的是自定义函数必须在解析模板之前。
自定义函数后,需要使用:Funcs(template.FuncMap{"add": Add}) 加载函数才可以使用
自定义函数示例:
func Add(a, b int) int {
return a + b
}
func index(w http.ResponseWriter, r *http.Request) {
//解析模板文件
temp, err := template.New("index.tpl").
Funcs(template.FuncMap{"add": Add}).
ParseFiles("template/index.tpl")
if err != nil {
fmt.Println("err:", err)
}
user := make(map[string]interface{})
user["name"] = "lampol"
//输出到浏览器
temp.Execute(w, user)}
html:
<p>add fun:{{ add 5 3}}</p>
模板嵌套示例1:加载其他页面
temp, err := template.New("index.tpl").
Funcs(template.FuncMap{"add": Add}).
ParseFiles("template/index.tpl", "template/user.tpl")
html:
在index.tpl中加载 user.tpl
{{ template "user.tpl" . }}
模板嵌套示例2:加载代码块
temp, err := template.New("index.tpl").
Funcs(template.FuncMap{"add": Add}).
ParseFiles("template/index.tpl")
html:
在 index.tpl中加载 user.tpl
引入user.tpl代码块
{{ template "user.tpl" . }}
{{define "user.tpl"}}
<p>hello user.tpl name:{{.name}}</p>
{{end}}
Block示例:
block等价于define定义一个名为name的模板,并在"有需要"的地方执行这个模板
block实例:
tpl模板页面调用content代码块:
{{block "content" .}} {{end}}
block代码块定义:
{{define "content"}}
<h5>block content name:{{.name}}</h5>
{{end}}
完结
但行好事,莫问前程!
本文来自博客园,作者:yangphp,转载请注明原文链接:https://www.cnblogs.com/ypeih/p/17294427.html