问题描述
有没有办法让我定义,当我只在 Go html 模板中输出一个值时,格式化的完成方式而不是打印字符串表示,而不必调用函数来显式转换它?
例如,假设我有一个类型 Person
并且我有一个模板只有 {{.}}
我希望它自动创建一个指向该人页面的链接但是如果我使用相同的模板并通过将生成其他一些 HTML 的不同类型的值。
我不想做的是必须写出诸如 {{.HTML}}
或 {{. | html}}
之类的东西。我已经意识到这些是可能的,但我的问题特别是关于如何避免这些。
我曾想过 Person.String()
以某种方式返回 HTML 代码而不会被转义,但除了无法使其正常工作之外,它似乎也是一个丑陋的解决方案。
我想过的另一个解决方案是将所有内容作为 HTML 传递到模板中,但随后我无法再访问这些属性(例如 {{.name}}
仅输出名称),而且我还必须将所有内容转换为 HTML 以防万一模板中使用。
解决方法
创建一个返回 template.HTML
类型的方法。即:
func (p *Person) HTML() template.HTML {
return fmt.Sprintf(`<a href="/person/%v">%s</a>`,p.id,template.HTMLEscapeString(p.name))
}
然后在您的模板中:
{{ .HTML }}