我是一个新手Go(和Go模板)的业余程序员,我已经看到了这个问题的变体被问到了,但是从来没有完全相同的方式,所以这里又一次......
我尝试执行以下而未注册任何其他功能(因此,严格限制自己限制模板语法允许的内容):
假设我有几个不同的HTML代码段,每个代码段都在自己的模板上:A.tpl
,B.tpl
,C.tpl
等等(数字不固定,而且会增长应用程序增长的时间;同样,子模板中没有隐式编号/顺序命名,如示例所暗示的那样。
然后我有一个主模板,用main.tpl
设置公共页眉,页脚,菜单等,以及每个页面周围必要的HTML包装,非常简单:
{{ if .A }}
{{ template "A.tpl" . }}
{{ end }}
{{ if .B }}
{{ template "B.tpl" . }}
{{ end }}
{{ if .C }}
{{ template "C.tpl" . }}
{{ end }}
...
或者,根据调用代码的执行方式,这也可以写成(假设我们将子模板的名称作为值传递给main.tpl
):
{{ if eq .SubTemplate "A.tpl" }}
{{ template "A.tpl" . }}
{{ end }}
{{ if eq .SubTemplate "B.tpl" }}
{{ template "B.tpl" . }}
{{ end }}
{{ if eq .SubTemplate "C.tpl" }}
{{ template "C.tpl" . }}
{{ end }}
...
显然,编写(在模板级别)显而易见的是:
{{ template .SubTemplate . }}
但当然这在语法上是无效的,因为template
只能使用字符串常量而不是值/变量作为参数(对吗?)
在模板上强制列出一长串if
语句背后的原因似乎是这种编程风格被认为是“逻辑”。这应该从模板中取出,至少在标准中是这样的。语言水平;程序员不应该将模板引擎(=表示层)视为具有任何内在的逻辑'在里面。当然,我不应该讨论什么是逻辑和什么不是(if
语句允许测试特定值的相等性并执行不同的块,具体取决于那些价值观对我来说绝对是“逻辑”,但显然不适合Go开发人员。)
Similar questions were asked a few years ago并且OP的回答从未令人满意。基本上,据我所知,有几个选择:
{{ if ... end }}
构造,但对我来说,它仍然缺乏单行的简单性和可读性。html/template
包攻击(或者更确切地说,扩展...),以便在四年前通过@Intermernet更改模板语法something which allegedly has been done。当然,这是一个有效的练习,但这意味着远离标准的Go库。如果这是选择,那么Go周围有很多模板引擎;我不愿意开始使用其中一个,并在几年后发现它已经过时,因为作者已经放弃了这个项目。使用不会发生的标准库(至少在谷歌出现时Ken Thompson还活着)。模板语法是否已经发展为允许我所描述的内容(我很遗憾没有找到任何有用的示例),或者我仍然坚持使Go代码复杂化,或者使用不同的非-standard去模板引擎来完成这个简单的任务?
如果您有任何见解,请提前感谢您。我仍然在交叉手指,希望我对Go模板语法的新手太多,并且它实际上允许我想要的东西,我只需要添加一些更尴尬的符号来允许{ {1}}关键字接受一个变量而不是一个字符串常量,到目前为止,这个问题一直困扰我: - )