1

我一直在尝试在 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 代表主模板)。

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

4

2 回答 2

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"}}

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

文档

文档的相关部分:

行动

这是动作列表。“参数”和“管道”是对数据的评估,详细定义如下。

...

{{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.

...

我希望这能解决问题。

于 2013-07-14T20:17:40.830 回答
0

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

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

于 2013-07-14T10:13:12.067 回答