我一直在尝试在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代表主模板)。
那么......我如何使用字符串变量中的嵌套表单,以便上面的示例有效?
答案 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. ...
我希望这可以解决问题。