
本文介绍了如何在 Go 模板中使用 template.ExecuteTemplate 函数渲染包含 HTML 内容的页面。通过将需要渲染的 HTML 内容转换为 template.HTML 类型,并修改数据结构,可以安全地在模板中输出 HTML 代码,避免转义,实现预期的页面效果。
在使用 Go 语言的 html/template 包时,默认会对 HTML 内容进行转义,以防止跨站脚本攻击(XSS)。然而,在某些场景下,我们需要在模板中直接输出 HTML 代码,而不进行转义。本文将介绍如何使用 template.ExecuteTemplate 函数,结合 template.HTML 类型,实现在 Go 模板中包含 HTML 内容的功能。
核心概念:template.HTML 类型
template.HTML 是 html/template 包提供的一个类型,用于标记一段字符串为 HTML 代码,告诉模板引擎不要对其进行转义。
立即学习“前端免费学习笔记(深入)”;
实现步骤
-
修改数据结构: 将存储 HTML 内容的字段类型修改为 template.HTML。例如,如果你的数据结构如下:
type Page struct { Title string Body []byte // 或者 string }则需要将其修改为:
import "html/template" type Page struct { Title string Body template.HTML } -
转换 HTML 内容: 在将数据传递给模板之前,将 HTML 内容转换为 template.HTML 类型。例如:
import "html/template" func handler(w http.ResponseWriter, r *http.Request) { // ... body := "This is HTML content.
" page := &Page{ Title: "My Page", Body: template.HTML(body), // 将字符串转换为 template.HTML } // ... templates.ExecuteTemplate(w, "view.html", page) } -
在模板中使用 {{.Body}}: 在模板文件中,直接使用 {{.Body}} 即可输出 HTML 内容,无需使用 printf 或 html 管道函数。例如:
{{.Title}}
{{.Body}}
示例代码
以下是一个完整的示例代码,演示了如何在 Go 模板中使用 template.ExecuteTemplate 包含 HTML 内容:
package main
import (
"html/template"
"net/http"
)
type Page struct {
Title string
Body template.HTML
}
var templates = template.Must(template.ParseFiles("view.html"))
func viewHandler(w http.ResponseWriter, r *http.Request) {
page := &Page{
Title: "My Page",
Body: template.HTML("This is HTML content.
"),
}
err := templates.ExecuteTemplate(w, "view.html", page)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
}
func main() {
http.HandleFunc("/", viewHandler)
http.ListenAndServe(":8080", nil)
}view.html 模板文件:
{{.Title}}
{{.Title}}
{{.Body}}
注意事项
- 安全性: 直接输出 HTML 内容存在安全风险,可能导致 XSS 攻击。请确保你了解潜在的风险,并采取适当的安全措施,例如对用户输入进行严格的过滤和验证。
- 类型转换: 必须将 HTML 内容转换为 template.HTML 类型,才能告诉模板引擎不要对其进行转义。
- 模板函数: 避免在模板中使用 printf "%s" .Body | html,直接使用 {{.Body}} 即可。
总结
通过将 HTML 内容转换为 template.HTML 类型,并修改数据结构,可以轻松地在 Go 模板中使用 template.ExecuteTemplate 函数渲染包含 HTML 内容的页面。然而,务必注意安全性问题,并采取适当的措施来防止 XSS 攻击。











