Template-模板解析
开始
Go的 html/template
包为html模板提供了丰富的模板语言。它主要用于web应用程序,以结构化方式在客户端浏览器中显示数据。Go模板语言的一大好处是数据的自动转义。无需担心XSS攻击,因为Go解析HTML模板并在将其显示到浏览器之前转义所有输入。
第一个 Template
在Go中编写模板非常简单。此示例显示了一个TODO列表,以HTML的无序列表(ul)形式编写。在呈现模板时,传入的数据可以是任何类型的Go数据结构。它可以是一个简单的字符串或数字,甚至可以是嵌套的数据结构,如下面的示例所示。要访问模板中的数据,最上面的变量是{{.}}
。大括号内的点称为管道和数据的根元素。
data := TodoPageData{
PageTitle: "My TODO list",
Todos: []Todo{
{Title: "Task 1", Done: false},
{Title: "Task 2", Done: true},
{Title: "Task 3", Done: true},
},
}
<h1>{{.PageTitle}}</h1>
<ul>
{{range .Todos}}
{{if .Done}}
<li class="done">{{.Title}}</li>
{{else}}
<li>{{.Title}}</li>
{{end}}
{{end}}
</ul>
控制结构
模板语言包含一组丰富的控件结构来呈现HTML。在这里,您将获得最常用工具的概述。要获得所有可能结构的详细列表,请访问:text/template
Control Structure | Definition |
---|---|
`{{/* a comment */}} | 定义注释 |
{{.}} |
渲染根节点 |
{{.Title}} |
渲染在嵌套元素中的 “Title”-字段 |
{{if .Done}} {{else}} {{end}} |
定义 if 语句 |
{{range .Todos}} {{.}} {{end}} |
遍历所有 “Todos” 和用 {{.}} 渲染每一个 |
{{block "content" .}} {{end}} |
定义块使用 “content” 名称 |
从文件解析 Templates
可以从字符串或磁盘上的文件解析模板。通常情况下,模板都是从磁盘上复制的,本例演示了如何做到这一点。在本例中,在与Go程序相同的目录中有一个名为layout.html的模板文件。
tmpl, err := template.ParseFiles("layout.html")
// or
tmpl := template.Must(template.ParseFiles("layout.html"))
在请求 Handler 中执行 Template
一旦从磁盘解析了模板,就可以在请求处理程序中使用了。 Execute
函数接收 io.Writer
用于写出模板的编写器和另外一个参数 interface{}
用于将数据传递到模板。调用函数 http.ResponseWriter
时 Content-Type 的 header 在HTTP响应中自动设置 Content-Type: text/html; charset=utf-8
。
func(w http.ResponseWriter, r *http.Request) {
tmpl.Execute(w, "data goes here")
}
代码(复制/粘贴)
这个是完整的代码,你可以通过这个例子自己尝试一下
package main
import (
"html/template"
"net/http"
)
type Todo struct {
Title string
Done bool
}
type TodoPageData struct {
PageTitle string
Todos []Todo
}
func main() {
tmpl := template.Must(template.ParseFiles("layout.html"))
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
data := TodoPageData{
PageTitle: "My TODO list",
Todos: []Todo{
{Title: "Task 1", Done: false},
{Title: "Task 2", Done: true},
{Title: "Task 3", Done: true},
},
}
tmpl.Execute(w, data)
})
http.ListenAndServe(":80", nil)
}
<h1>{{.PageTitle}}</h1>
<ul>
{{range .Todos}}
{{if .Done}}
<li class="done">{{.Title}}</li>
{{else}}
<li>{{.Title}}</li>
{{end}}
{{end}}
</ul>