如何使用结构或变量值的字段作为模板名称?

如何使用结构或变量值的字段作为模板名称?,第1张

如何使用结构或变量值的字段作为模板名称

不幸的是你不能。

{{template}}
动作的语法:

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

要包含的模板的名称是一个 常量 字符串,它不是 管道 ,在执行过程中可能会根据参数而有所不同。

如果允许的语法为:

{{template pipeline}}

那么您可以使用类似的命令,

{{template .TemplName}}
但是由于语法仅允许使用常量字符串,因此您不能这样做。

从Rob推论为什么不允许动态模板调用(来源):

我们希望模板语言可以进行静态分析,以便模板调用的上下文清晰,可检查且可锁定。如果调用点是完全动态的,则无法完成。类似地,如果一个模板可以属于多个集合,则其上下文可以在集合之间有所不同,从而需要同时分析所有集合。由于您可以根据需要轻松地解决这两个约束,而这是以丢失更高级别包中的静态检查为代价的,因此控制基本模板实现中的情况似乎是明智的。如果约束清楚,则较高级别的程序包(例如,假设的仅HTML的包装程序)可以更轻松地保证没有变通办法。

选择#1:首先执行包含模板

您可以做的是先执行要包含的模板,然后将结果插入要包含的模板中。您可以使用特殊类型,例如

html.HTML
在HTML模板的情况下,在插入时不要逃脱内部模板的结果。

请参阅以下示例:

func main() {    t := template.Must(template.New("t").Parse(t))    template.Must(t.New("t1").Parse(t1))    params := struct {        Name  string        Value interface{}    }{"t1", nil}    b := bytes.Buffer{}    t.ExecuteTemplate(&b, params.Name, nil)    params.Value = template.HTML(b.String())    t.Execute(os.Stdout, params)}const t = `<html><body>Now I will include template with name: {{.Name}}{{.Value}}</body>/html>`const t1 = `I'm template <b>t1</b>.`

输出:

<html><body>Now I will include template with name: t1I'm template <b>t1</b>.</body>/html>

在Go Playground上尝试一下。

模板的结果

t1
未转义插入。如果您忽略
template.HTML

params.Value = b.String()

t1
将插入转义,像这样:

<html><body>Now I will include template with name: t1I&#39;m template &lt;b&gt;t1&lt;/b&gt;.</body>/html>
备选方案2:重组模板

您可以重组模板,使其不希望包含不同名称的模板。

示例:您可能想在其中具有如下

page
模板的页面中创建页面:

<html><body>    Title, headers etc.    {{template .Page}}    Footers</body></html>

您可以将其重组为以下形式:

header
模板:

<html><body>    Title, headers, etc.

footer
模板:

    Footers</body></html

而你的页面模板将包括

header
footer
这样的:

{{template "header" .}}    Page content comes here.{{template "footer" .}}
备选方案3:使用
{{if}}
*** 作和预定义名称

如果您事先知道模板名称并且它不是详尽的列表,则可以使用

{{if}}
模板 *** 作包括所需的模板。例:

{{if eq .Name "page1"}}    {{template "page1" .}}{{else if eq .Name "page2"}}    {{template "page2" .}}    ...{{end}}
备选方案4:修改静态模板文本

这里的想法是,您可以手动修改外部模板的静态文本,并插入要包括的内部模板的名称。

这种方法的缺点是,在插入内部模板的名称之后,您必须重新解析该模板,因此,我不建议这样做。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4909051.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-12
下一篇 2022-11-12

发表评论

登录后才能评论

评论列表(0条)

保存