登录
首页 >  Golang >  Go问答

忽略在Go模板/文本中的特定元素

来源:stackoverflow

时间:2024-03-12 20:18:27 421浏览 收藏

欢迎各位小伙伴来到golang学习网,相聚于此都是缘哈哈哈!今天我给大家带来《忽略在Go模板/文本中的特定元素》,这篇文章主要讲到等等知识,如果你对Golang相关的知识非常感兴趣或者正在自学,都可以关注我,我会持续更新相关文章!当然,有什么建议也欢迎在评论留言提出!一起学习!

问题内容

我有一个通过 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 %}的东西。这样,我可以使用任何具有模板/文本解析器的 go 二进制文件,而无需更改和重新编译它。

谢谢。


解决方案


我想我找到了答案。

根据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}}"`}}

您可以更改需要解析的分隔符,因此其余部分将被“忽略”。您可以使用 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}}"

今天关于《忽略在Go模板/文本中的特定元素》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>