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

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


那么...如何使用字符串变量中的嵌套形式,以便上述示例有效?


红颜莎娜
浏览 206回答 2
2回答

Smart猫小萌

我认为您尝试使用嵌套模板的方法是错误的。如果你想.在嵌套模板中定义,你必须为嵌套模板的调用提供一个参数,就像你对ExecuteTemplate函数所做的一样:{{define "RT"}}Status&nbsp; &nbsp; &nbsp; - {{.Status}}Proto&nbsp; &nbsp; &nbsp; &nbsp;- {{.Proto}}{{end}}{{define "HT"}}{{range $key, $val := .}}{{$key}} - {{$val}}{{end}}{{end}}{{define "BT"}}{{.}}{{end}}{{define "MT"}}<html>&nbsp; &nbsp; <body>&nbsp; &nbsp; &nbsp; &nbsp; <pre>-- Response --{{template "RT" .Resp}}--&nbsp; Header&nbsp; --{{template "HT" .Header}}--&nbsp; &nbsp;Body&nbsp; &nbsp;--{{template "BT" .Body}}&nbsp; &nbsp; &nbsp; &nbsp; </pre>&nbsp; &nbsp; </body></html>{{end}}{{template "MT"}}您似乎错过的重要部分是模板不封装状态。当您执行模板时,引擎会评估给定参数的模板,然后写出生成的文本。它不会保存参数或为将来调用而生成的任何内容。文档文档的相关部分:行动这是操作列表。“参数”和“管道”是对数据的评估,详细定义如下。...{{template "name"}}&nbsp; The template with the specified name is executed with nil data.{{template "name" pipeline}}&nbsp; The template with the specified name is executed with dot set&nbsp; to the value of the pipeline....我希望这可以解决问题。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go