我想打印用户列表,例如:<@user1> <@user2>
,这是我公司内部的内部格式,但是golang模板总是转义<
至<
。我的代码:
tpl, _ := template.New("text").Parse(`{{range .Users}} <@{{.}}> {{end}}`)
var buffer bytes.Buffer
tpl.Execute(&buffer, struct {
Users []string
}{
Users: []string{"user1", "user2"},
})
fmt.Println(buffer.String())
预期:
<@user1> <@user2>
输出:
<@user1> <@user2>
如何解决这个问题?
最佳答案
如果您想这样做,请使用文本/模板。以下是为了更好地理解每个文档的一部分:
戈多克:html/template:
此包包装了包文本/模板,以便您可以共享其模板 API 来安全地解析和执行 HTML 模板。
tmpl, err := template.New("name").Parse(...)
// Error checking elided
err = tmpl.Execute(out, data)
如果成功,tmpl 现在将是注入(inject)安全的。否则,err 是 ErrorCode 文档中定义的错误。
HTML 模板将数据值视为纯文本,应对其进行编码,以便可以安全地嵌入 HTML 文档中。转义是上下文相关的,因此操作可以出现在 JavaScript、CSS 和 URI 上下文中。
此包使用的安全模型假定模板作者是可信的,而 Execute 的数据参数则不然。下面提供了更多详细信息。
示例
import "text/template"
...
t, err := template.New("foo").Parse(`{{define "T"}}Hello, {{.}}!{{end}}`)
err = t.ExecuteTemplate(out, "T", "<script>alert('you have been pwned')</script>")
产生
Hello, <script>alert('you have been pwned')</script>!
但是 html/template 中的上下文自动转义
import "html/template"
...
t, err := template.New("foo").Parse(`{{define "T"}}Hello, {{.}}!{{end}}`)
err = t.ExecuteTemplate(out, "T", "<script>alert('you have been pwned')</script>")
生成安全、转义的 HTML 输出
Hello, <script>alert('you have been pwned')</script>!
关于go - 范围内的转义模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64868612/