Go 1.6引入了一个新的块动作(block action),这个动作允许用户定义一个模板并且立即使用。块动作看上去是下面这个样子的:
{{ block arg }}
Dot is set to arg
{{ end }}
为了更好地了解块动作的使用方法,我们将使用块动作重新实现上一节展示过的例子,并在处理器没有指定特定的模板时,默认展示蓝色的Hello World
模板。代码清单5-29展示了修改之后的处理器,正如加粗的代码行所示,处理器的else
块将不再同时分析layout.html
文件和blue_hello.html
文件,而是只分析layout.html
文件。
代码清单5-29 只对layout.html
进行语法分析
func process(w http.ResponseWriter, r *http.Request) {
rand.Seed(time.Now().Unix())
var t *template.Template
if rand.Intn(10) > 5 {
t, _ = template.ParseFiles("layout.html", "red_hello.html")
} else {
t, _ = template.ParseFiles("layout.html")
}
t.ExecuteTemplate(w, "layout", "")
}
如果我们现在就重新编译并启动服务器,那么服务器就会因为在else
块中找不到需要进行语法分析的content
模板而出现随机崩溃的情况。为了解决这个问题,我们需要像代码清单5-30所示的那样,在layout.html
模板文件中通过块动作定义content
模板,并将其用作默认的content
模板。
代码清单5-30 通过块动作添加默认的content
模板
{{ define "layout" }}
< html>
< head>
< meta http-equiv="Content-Type" content="text/html; charset=utf-8">
< title>Go Web Programming< /title>
< /head>
< body>
{{ block "content" . }}
< h1 style="color: blue;">Hello World!< /h1>
{{ end }}
< /body>
< /html>
{{ end }}
块动作能够高效地定义一个content
模板,并将它放置到layout
模板里面。当layout
模板被执行时,如果模板引擎没有找到可用的content
模板,那么它就会使用块动作中定义的content
模板。
在最近的这几章,我们学习了如何接收请求,如何处理请求,以及如何生成用于响应请求的内容,而在接下来的一章,我们将要学习如何通过Go语言将数据存储到内存、文件或者数据库里面。