快速开始
~~~
func handler(w http.ResponseWriter,r *http.Request){
t := template.New("new template") //创建一个模板
t,err := t.ParseFile("tpl/welcome.html",nil) //解析模板文件
if err != nil{
panic(err.Error())
}
user := GetUser() //获取用户信息
t.Execute(w,user) //执行模板,并通过w输出
}
~~~
各种模板
{{.}} 表示当前对象,如user对象
{{.FieldName}} 表示对象的某个字段
{{range …}}{{end}} go中for…range语法类似,循环
{{with …}}{{end}} 当前对象的值,上下文
~~~
//一个模板文件例子
hello {{.UserName}}!
{{range .Emails}}
an email {{.}}
{{end}}
{{with .Friends}}
{{range .}}
my friend name is {{.Fname}}
{{end}}
{{end}}
~~~
{{if …}}{{else}}{{end}} go中的if-else语法类似,条件选择
~~~
//if 后只能出现bool值,不支持bool表达式
if-else demo:
{{if .ShowFlag}}
section if
{{else}}
section else.
{{end}}
~~~
pipeline
左边的输出作为右边的输入
~~~
//当前对象作为参数,传入内置函数html中
{{. | html}}
~~~
模板变量
模板使用过程中定义局部变量
~~~
{{with $x := "output"}}{{$x}}{{end}}
{{with $x := "output"}}{{$x | printf "%s"}}{{end}}
~~~
输出
~~~
output
output
~~~
模板函数
支持的函数类型
~~~
func(args ...interface{})string
~~~
函数定义例子
~~~
func Say(args ...interface{})string{
return fmt.Sprintf("%s %v","Hello",args[0])
}
~~~
注册函数
~~~
t = t.Funcs(template.FuncMap{"Say":Say})
~~~
模板定义
~~~
{{Say `Func`}}
{{`Pipe` | Say}}
~~~
输出:
~~~
Hello Func
Hello Pipe
~~~
template中内置函数
~~~
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,
}
~~~
Must操作
检测模板是否正确:大括号是否匹配,注释是否正确关闭,变量是否正确
~~~
tOk := template.New("first")
template.Must(tOk.Parse(" some static text /* and a comment */"))
fmt.Println("The first one parsed OK.")
template.Must(template.New("second").Parse("some static text {{ .Name }}"))
fmt.Println("The second one parsed OK.")
fmt.Println("The next one ought to fail.")
tErr := template.New("check parse error with Must")
template.Must(tErr.Parse(" some static text {{ .Name }"))
~~~
输出:
~~~
The first one parsed OK.
The second one parsed OK.
The next one ought to fail.
panic: template: check parse error with Must:1: unexpected "}" in command
~~~
模板嵌套
将模板模块化,如在web开发中定义header,content,footer三个子模块
~~~
//声明
{{define "module_name"}}content{{end}}
//调用
{{template "module_name"}}
~~~
以下定义三个文件:
- header.html
~~~
{{define "header"}}
<html>
<head>
<title>演示信息</title>
</head>
<body>
{{end}}
~~~
footer.tmpl
~~~
{{define "footer"}}
</body>
</html>
{{end}}
~~~
content.tmpl
~~~
{{define "content"}}
{{template "header"}}
<h1>演示嵌套</h1>
<ul>
<li>嵌套使用define定义子模板</li>
<li>调用使用template</li>
</ul>
{{template "footer"}}
{{end}}
~~~
go代码
ParseFiles:所有嵌套的模板全部解析到模板中
~~~
s1,_ := template.ParseFiles("header.tmpl","content.tmpl","footer.tmpl")
s1.ExecuteTemplate(w, "header",nil)
s1.ExecuteTemplate(w, "footer", nil)
s1.ExecuteTemplate(w, "content", nil)
~~~
![](https://box.kancloud.cn/032176b8778dbc41f1ce6b79a83d59c1_900x350.jpg)
- Go语言基础篇
- Go语言简介
- Go语言教程
- Go语言环境安装
- Go语言结构
- Go语言基础语法
- Go语言数据类型
- Go语言变量
- Go语言提高篇
- Go语言实现贪吃蛇
- Go 谚语
- 解决连通性问题的四种算法
- golang 几种字符串的连接方式
- Go JSON 技巧
- Go += 包版本
- Golang 编译成 DLL 文件
- Go指南:牛顿法开方
- Go语言异步服务器框架原理和实现
- Golang适合高并发场景的原因分析
- 如何设计并实现一个线程安全的 Map ?(上篇)
- go语言执行cmd命令关机、重启等
- IT杂项
- IT 工程师的自我管理
- IT界不为人知的14个狗血故事
- Go语言版本说明
- Go 1.10中值得关注的几个变化
- Golang面试题解析
- Golang面试题
- Golang语言web开发
- golang 模板(template)的常用基本语法
- go语言快速入门:template模板
- Go Template学习笔记
- LollipopGo框架
- 框架简介
- Golang语言版本设计模式
- 设计模式-单例模式
- Golang语言资源下载
- 公众账号
- leaf
- 合作讲师
- 公开课目录