如何在Go中使用来自常量字符串变量的嵌套模板?

时间:2013-07-14 07:07:23

标签: go go-templates

我一直在尝试在Go中使用嵌套模板,但是示例或帮助文档对我没有帮助,其他3个博客中的示例并不是我想要的(一个是接近的,也许是唯一的方法,但我想确定)

好的,所以我的代码是针对App Engine的,在这里我将对服务器进行urlfetch,然后我想显示一些结果,比如Response,标题和正文

const statusTemplate = `
{{define "RT"}}
Status      - {{.Status}}
Proto       - {{.Proto}}
{{end}}
{{define "HT"}}
{{range $key, $val := .}}
{{$key}} - {{$val}}
{{end}}
{{end}}
{{define "BT"}}
{{.}}
{{end}}
{{define "MT"}}
<html>
    <body>
        <pre>
-- Response --
{{template "RT"}}

--  Header  --
{{template "HT"}}

--   Body   --
{{template "BT"}}
        </pre>
    </body>
</html>
{{end}}
{{template "MT"}}`

func showStatus(w http.ResponseWriterm r *http.Request) {
    /*
     *  code to get:
     *  resp as http.Response
     *  header as a map with the header values
     *  body as an string wit the contents
     */
    t := template.Must(template.New("status").Parse(statusTemplate)
    t.ExecuteTemplate(w, "RT", resp)
    t.ExecuteTemplate(w, "HT", header)
    t.ExecuteTemplate(w, "BT", body)
    t.Execute(w, nil)
}

我的代码实际输出具有正确值的RT,HT和BT模板,然后输出MT模板为空(MT代表主模板)。

那么......我如何使用字符串变量中的嵌套表单,以便上面的示例有效?

2 个答案:

答案 0 :(得分:1)

看看这个教程:
http://javatogo.blogspot.com

在那里解释了如何使用嵌套模板。

答案 1 :(得分:1)

我认为您尝试使用嵌套模板的方法是错误的。如果要在嵌套模板中定义.,则必须为嵌套模板的调用提供参数,就像使用ExecuteTemplate函数一样:

{{define "RT"}}
Status      - {{.Status}}
Proto       - {{.Proto}}
{{end}}
{{define "HT"}}
{{range $key, $val := .}}
{{$key}} - {{$val}}
{{end}}
{{end}}
{{define "BT"}}
{{.}}
{{end}}
{{define "MT"}}
<html>
    <body>
        <pre>
-- Response --
{{template "RT" .Resp}}

--  Header  --
{{template "HT" .Header}}

--   Body   --
{{template "BT" .Body}}
        </pre>
    </body>
</html>
{{end}}
{{template "MT"}}

您似乎错过的重要部分是模板封装状态。执行模板时,引擎会评估给定参数的模板,然后写出生成的文本。它不会保存参数或为将来的调用生成的任何内容。

文档

documentation的相关部分:

  

操作

     

以下是操作列表。 “论据”和“管道”是   数据评估,详见下文。

...

{{template "name"}}
  The template with the specified name is executed with nil data.

{{template "name" pipeline}}
  The template with the specified name is executed with dot set
  to the value of the pipeline.

...

我希望这可以解决问题。