根据模板

时间:2017-07-08 11:07:45

标签: templates go go-html-template

我是一个新手Go(和Go模板)的业余程序员,我已经看到了这个问题的变体被问到了,但是从来没有完全相同的方式,所以这里又一次......

我尝试执行以下而未注册任何其他功能(因此,严格限制自己限制模板语法允许的内容):

假设我有几个不同的HTML代码段,每个代码段都在自己的模板上:A.tplB.tplC.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的回答从未令人满意。基本上,据我所知,有几个选择:

  1. 定义一个新函数,扩展模板代码,最终创建等效的switch语句;这至少可以节省一些{{ if ... end }}构造,但对我来说,它仍然缺乏单行的简单性和可读性。
  2. 整个html/template包攻击(或者更确切地说,扩展...),以便在四年前通过@Intermernet更改模板语法something which allegedly has been done。当然,这是一个有效的练习,但这意味着远离标准的Go库。如果这是选择,那么Go周围有很多模板引擎;我不愿意开始使用其中一个,并在几年后发现它已经过时,因为作者已经放弃了这个项目。使用不会发生的标准库(至少在谷歌出现时Ken Thompson还活着)。
  3. 对Go侧使用的子模板进行所有处理。这自然是可行的,但(恕我直言)它会导致代码不太可读。当然,我了解Go程序员之间的意识形态斗争,以及那些热衷于写作和惯用语的人之间的斗争。 (但难以理解)代码,以及其他许多有不同方式编写Go代码的派系。就个人而言,我坚持Principle of Least SurpriseKISS - 我希望自己的代码在我写完十年后也能理解:)
  4. 模板语法是否已经发展为允许我所描述的内容(我很遗憾没有找到任何有用的示例),或者我仍然坚持使Go代码复杂化,或者使用不同的非-standard去模板引擎来完成这个简单的任务?

    如果您有任何见解,请提前感谢您。我仍然在交叉手指,希望我对Go模板语法的新手太多,并且它实际上允许我想要的东西,我只需要添加一些更尴尬的符号来允许{ {1}}关键字接受一个变量而不是一个字符串常量,到目前为止,这个问题一直困扰我: - )

0 个答案:

没有答案