如何忽略 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}}"`}}
我有一个通过 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}}"`}}