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语言将数据存储到内存、文件或者数据库里面。

results matching ""

    No results matching ""