Go Web 示例: 模板

简介

Go 的 html/template 包为 HTML 模板提供了丰富的模板语言。 它主要用于 Web 应用程序中,以在客户端浏览器中以结构化方式显示数据。 Go 模板语言的一大好处是自动转义数据。 无需担心 XSS 攻击,因为 Go 会解析 HTML 模板并在将其显示给浏览器之前转义所有输入。

第一个模板

在 Go 中编写模板非常简单。 此示例显示了一个 TODO 列表,在 HTML 中编写为无序列表 (ul)。 在渲染模板时,传入的数据可以是任何一种 Go 的数据结构。 它可能是一个简单的字符串或数字,甚至可以是嵌套的数据结构,如下例所示。 要访问模板中的数据,最顶层的变量是通过 {{.}} 访问。 花括号内的点称为管道和数据的根元素。

1
2
3
4
5
6
7
8
data := TodoPageData{
    PageTitle: "My TODO list",
    Todos: []Todo{
        {Title: "Task 1", Done: false},
        {Title: "Task 2", Done: true},
        {Title: "Task 3", Done: true},
    },
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<h1>{{.PageTitle}}</h1>
<ul>
    {{range .Todos}}
        {{if .Done}}
            <li class="done">{{.Title}}</li>
        {{else}}
            <li>{{.Title}}</li>
        {{end}}
    {{end}}
</ul>

控制结构

模板语言包含一组丰富的控制结构来呈现您的 HTML。 在这里,您将获得最常用的概述。 要获得所有可能结构的详细列表,请访问:文本/模板

控制结构定义
{{/* a comment */}}定义一个注释
{{.}}渲染根元素
{{.Title}}在嵌套元素中呈现“标题”字段
{{if .Done}} {{else}} {{end}}定义一个if条件语句
{{range .Todos}} {{.}} {{end}}遍历Todos子元素并用{{.}}渲染
{{block “content” .}} {{end}}定义一个名为content的块

从文件解析模板

模板可以从字符串或磁盘文件中解析。 通常情况下,模板是从磁盘中提取的,此示例显示了如何执行此操作。 在这个例子中,在 Go 程序所在的目录中有一个名为 layout.html 的模板文件。

1
2
3
tmpl, err := template.ParseFiles("layout.html")
// or
tmpl := template.Must(template.ParseFiles("layout.html"))

在请求处理程序中执行模板

从磁盘解析模板后,它就可以在请求处理程序中使用了。 Execute 函数接受用于写出模板的 io.Writer 和用于将数据传递到模板的接口{}。{} 当在 http.ResponseWriter 上调用该函数时,Content-Type 标头会在 HTTP 响应中自动设置为 Content-Type: text/html; charset=utf-8

1
2
3
func(w http.ResponseWriter, r *http.Request) {
    tmpl.Execute(w, "data goes here")
}

完整代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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)
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<h1>{{.PageTitle}}</h1>
<ul>
    {{range .Todos}}
        {{if .Done}}
            <li class="done">{{.Title}}</li>
        {{else}}
            <li>{{.Title}}</li>
        {{end}}
    {{end}}
</ul>

本文翻译自:https://gowebexamples.com/templates/

updatedupdated2021-06-132021-06-13
Load Comments?