Go HTML 模板:类似于 Jinja2 宏的东西?

Joe*_*ate 5 go

这在一定程度上是我之前问题的后续。我现在试图解决的问题是用参数转换 Jinja2 宏,例如

{% macro example(arg1, arg2) %}
{% if arg1 %}
   do something with arg1 and arg2
{% endif %}
{% endmacro %}
Run Code Online (Sandbox Code Playgroud)

AFAICT,在 Go 中,最接近的等效项是嵌套模板,例如,

{{define "example"}}
{{if .Arg1}}
    do something with .Arg1 and .Arg2
{{end}}
{{end}}
Run Code Online (Sandbox Code Playgroud)

然而,在 Jinja 中arg1, 和arg2是我所说的真参数,即,当你调用example宏时,你将其调用为{{example(par1, par2)}},而在 Go 中,你使用{{template "example" .}}和 点,在我看来,它类似于未定义(或未明确定义)的全局变量工作区。

问题是当这些参数在调用模板中定义时,即,假设在 Jinja 中它{{example("somestring", "another")}}在一个模板中被调用,而其他两个字符串在另一个模板中被调用。我以为我可以使用变量来传递信息,例如,{{$arg1 := "somestring"}}然后调用模板,甚至在与调用相同的操作中定义变量,但 Go 不断抱怨,undefined variable "$arg1"所以这似乎是不可能的。

我知道我可以将字符串的定义“推送”到调用 Go 代码,但是除了使调用树变得复杂之外,这感觉不太对,因为毕竟模板是演示代码,而这些字符串是演示的一部分,而不是业务逻辑。它不仅仅是字符串参数,还有 (a) 格式化函数的实例(例如upper()and lower()--我知道我可以在 funcmap 中定义它们)和 (b) HTML 格式化宏,例如,将 CSS 类属性作为一个的论点。

是否有希望使用 Go 模板解决方案,或者我应该放弃并使用其他东西?

Liy*_*ang 6

Go 模板故意变得非常基础。你会发现,大多数时候,当你在寻找一些看似不可能的东西时,你可能最终会使用 golang 函数来解决它。它有助于使模板更简单,并将代码推送到更易于测试的 golang 函数中。

https://golang.org/pkg/html/template/#Template.Funcs

另外,还有许多功能更齐全的替代模板引擎。