以下Go模板处理没有错误:
{{block "A" "hello"}}{{end}}
{{define "A"}}{{.}}{{end}}
输出是" hello",正如我期望的阅读文档。相反,以下模板不解析:
{{block "A" "hello"}}A{{end}}
{{define "A"}}{{.}}{{end}}
这里我收到错误消息
template: multiple definition of template "A"
为什么第二个模板会出错而第一个模板没有?这有什么意义吗?
答案 0 :(得分:1)
答案在于html/template.Parse()
的文件:
[...] 如果结果模板非空(包含模板定义以外的内容),则会出错,并且会替换具有相同名称的非空模板。(在使用相同的接收器模板多次调用Parse时,只有一个调用可以包含空格,注释和模板定义以外的文本。)
您的第一个模板有效,因为{{block "A"}}
定义了一个空模板,因此可以重新定义它。
您的第二个模板失败,因为{{block "A"}}
定义了非空模板,但您尝试使用非空模板重新定义它。
有一点需要注意:我引用了html/template
包中的文档,该文档应与text/template
“相同”。大多数情况下,text/template.Parse()
是不同的,并且遗漏了这个重要细节,但它们的工作方式相同。这是文档不一致,提出了一个问题,可在此处跟踪:issue #17360。