重新定义Go模板:有时可行,有时会失败

时间:2016-10-06 15:49:04

标签: go go-templates

以下Go模板处理没有错误:

{{block "A" "hello"}}{{end}}
{{define "A"}}{{.}}{{end}}

输出是" hello",正如我期望的阅读文档。相反,以下模板不解析:

{{block "A" "hello"}}A{{end}}
{{define "A"}}{{.}}{{end}}

这里我收到错误消息

template: multiple definition of template "A"

为什么第二个模板会出错而第一个模板没有?这有什么意义吗?

完整代码在此处:https://play.golang.org/p/CNAqllVLjB

1 个答案:

答案 0 :(得分:1)

答案在于html/template.Parse()的文件:

  

[...] 如果结果模板非空(包含模板定义以外的内容),则会出错,并且会替换具有相同名称的非空模板。(在使用相同的接收器模板多次调用Parse时,只有一个调用可以包含空格,注释和模板定义以外的文本。)

您的第一个模板有效,因为{{block "A"}}定义了一个空模板,因此可以重新定义它。

您的第二个模板失败,因为{{block "A"}}定义了非空模板,但您尝试使用非空模板重新定义它。

有一点需要注意:我引用了html/template包中的文档,该文档应与text/template“相同”。大多数情况下,text/template.Parse()是不同的,并且遗漏了这个重要细节,但它们的工作方式相同。这是文档不一致,提出了一个问题,可在此处跟踪:issue #17360