如何忽略 go template/text 中的元素

How to ignore elements in go template/text

我有一个通过 go template/text 转换的文件。该文件包含我希望模板解析器忽略的一行。这一行包含的键与模板的语法非常相似,它会混淆解析器。它试图解释它们,但它不应该。

这是令人困惑的一行:

GRAVATAR_SOURCE = https://{{ .Env.GRAVATARHOST }}
# Line I would like go template/text to ignore
ACCESS_LOG_TEMPLATE = {{.Ctx.RemoteAddr}} - {{.Identity}} {{.Start.Format "[02/Jan/2006:15:04:05 -0700]" }} "{{.Ctx.Req.Method}} {{.Ctx.Req.RequestURI}} {{.Ctx.Req.Proto}}" {{.ResponseWriter.Status}} {{.ResponseWriter.Size}} "{{.Ctx.Req.Referer}}\" \"{{.Ctx.Req.UserAgent}}"

如您所见,GRAVATAR_SOURCE 已被 go template/text 成功解析,但 ACCESS_LOG_TEMPLATE 中断,因为它不应被解析(此行中的模板用于日志解析器).

我如何告诉 go template/text 忽略该行?

我想在 jinja2 中使用等同于 {% raw %}{% endraw %} 的东西。这样,我可以使用任何具有 template/text 解析器的 go 二进制文件,而无需更改和重新编译它。

谢谢。

您可以更改需要解析的分隔符,因此其余部分将是"ignored"。您可以为此使用 Template.Delims() 方法。

例如:

t := template.Must(template.New("").Delims("[[", "]]").Parse(src))
m := map[string]interface{}{
    "Env": map[string]interface{}{
        "GRAVATARHOST": "xx",
    },
}
if err := t.Execute(os.Stdout, m); err != nil {
    panic(err)
}

const src = `GRAVATAR_SOURCE = https://[[ .Env.GRAVATARHOST ]]
# Line I would like go template/text to ignore
ACCESS_LOG_TEMPLATE = {{.Ctx.RemoteAddr}} - {{.Identity}} {{.Start.Format "[02/Jan/2006:15:04:05 -0700]" }} "{{.Ctx.Req.Method}} {{.Ctx.Req.RequestURI}} {{.Ctx.Req.Proto}}" {{.ResponseWriter.Status}} {{.ResponseWriter.Size}} "{{.Ctx.Req.Referer}}\" \"{{.Ctx.Req.UserAgent}}"
`

这将输出(在 Go Playground 上尝试):

GRAVATAR_SOURCE = https://xx
# Line I would like go template/text to ignore
ACCESS_LOG_TEMPLATE = {{.Ctx.RemoteAddr}} - {{.Identity}} {{.Start.Format "[02/Jan/2006:15:04:05 -0700]" }} "{{.Ctx.Req.Method}} {{.Ctx.Req.RequestURI}} {{.Ctx.Req.Proto}}" {{.ResponseWriter.Status}} {{.ResponseWriter.Size}} "{{.Ctx.Req.Referer}}\" \"{{.Ctx.Req.UserAgent}}"

我想我找到了答案。

根据https://golang.org/pkg/text/template/#hdr-Examples

我可以将我的 ACCESS_LOG_TEMPLATE 包装成:

{{`"output"`}}

这样:

GRAVATAR_SOURCE = https://{{ .Env.GRAVATARHOST }}
# Line I would like go template/text to ignore
{{`ACCESS_LOG_TEMPLATE = {{.Ctx.RemoteAddr}} - {{.Identity}} {{.Start.Format "[02/Jan/2006:15:04:05 -0700]" }} "{{.Ctx.Req.Method}} {{.Ctx.Req.RequestURI}} {{.Ctx.Req.Proto}}" {{.ResponseWriter.Status}} {{.ResponseWriter.Size}} "{{.Ctx.Req.Referer}}\" \"{{.Ctx.Req.UserAgent}}"`}}