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>

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 查看所有版本


暂无话题~