首页 > 解决方案 > 为多个文件划分模板不提供数据

问题描述

我有一个带有 1 个文件(原始文件)的模板,它按预期工作,现在当它变大时,我开始将它划分为3 files并将数据从原始文件复制并粘贴到 3 个文件中,我能够看到模板已成功执行,但模板中缺少数据startend只是main模板从正确接收数据structData

例如

startTemple.txt

{{define "start"}}
...

{{end}}


main.txt (here i include both template)

{{template "start"}}
...

{{template "end"}}


endTemplate.txt


{{define "end"}}
...
{{end}}

我使用以下

t, err := template.New(mainTemplateName).Funcs(funcMap).ParseFiles(startPath, mainPath, endPath)

err = t.Execute(templFile, structData)
if err != nil {
    logs.Logger.Error(err)
}

我像以前一样使用确切的代码,问题是生成后的数据structData没有出现在模板中,只是在start正确获取 structData 时,我可能会在这里遗漏什么?endmain

使用硬编码的数据成功生成了模板(开始主端) ,但是应该来自的数据在生成过程中没有添加到和模板中structDatastartend

我应该以某种方式将 thestructData也添加到startand吗?end

标签: templatesgogo-templates

解决方案


当您使用template调用另一个模板时,dot默认情况下未设置,但您可以将该值作为(可选)第二个参数传递,template如下所示:

{{template "name"  pipeline}}

在您的情况下,您的main.txt模板应该是

{{template "start" .}}
...
{{template "end" .}}

dot将down的值传递给startandend模板。

因为dot可以通过这种方式设置 的值,所以也可以以更复杂的方式将模板拆分为多个文件。例如,您可以有一个 HTML 模板以卡片样式的方式显示用户信息,并且无论您想在输出中插入此卡片的任何位置,您都可以调用该模板并将其传递给用户,即使周围的模板还需要其他信息或循环使用。

有关更多详细信息,请查看text/template文档。这适用于text/templatehtml/template,但仅针对 明确记录text/template,而在文档开头有一个注释html/template告诉您,可以在哪里找到详细文档。


推荐阅读