95人参与 • 2025-04-24 • Golang
go语言的 html/template 模块是专门用于生成安全 html 输出的模板引擎,支持自动转义以防止 xss 攻击。以下是该模块的核心方法及用法示例:
解析模板字符串并渲染数据。
package main
import (
"html/template"
"os"
)
func main() {
// 定义模板字符串
tmplstr := `<h1>{{.title}}</h1><p>{{.content}}</p>`
// 解析模板
tmpl, err := template.new("page").parse(tmplstr)
if err != nil {
panic(err)
}
// 定义数据
data := struct {
title string
content string
}{
title: "欢迎页面",
content: "这是安全渲染的内容!",
}
// 渲染并输出到标准输出
err = tmpl.execute(os.stdout, data)
if err != nil {
panic(err)
}
}
输出结果:
<h1>欢迎页面</h1><p>这是安全渲染的内容!</p>
从多个文件加载模板,支持模板继承和嵌套。
// 文件: templates/header.html
{{ define "header" }}<header>{{.sitename}}</header>{{ end }}
// 文件: templates/page.html
{{ define "page" }}
<!doctype html>
<html>
{{ template "header" . }}
<body>
<h1>{{.title}}</h1>
</body>
</html>
{{ end }}
func main() {
// 解析多个模板文件
tmpl, err := template.parsefiles(
"templates/header.html",
"templates/page.html",
)
if err != nil {
panic(err)
}
// 渲染数据
data := struct {
sitename string
title string
}{
sitename: "我的网站",
title: "主页",
}
// 指定使用 "page" 模板渲染
err = tmpl.executetemplate(os.stdout, "page", data)
}
输出结果:
<!doctype html>
<html>
<header>我的网站</header>
<body>
<h1>主页</h1>
</body>
</html>
默认情况下,所有变量内容会被转义。
data := struct {
userinput string
}{
userinput: "<script>alert('xss')</script>",
}
tmplstr := `<div>{{.userinput}}</div>`
tmpl, _ := template.new("test").parse(tmplstr)
tmpl.execute(os.stdout, data)
输出结果:
<div><script>alert('xss')</script></div>
使用 template.html 类型标记安全内容。
data := struct {
safecontent template.html
}{
safecontent: template.html("<b>加粗文本</b>"),
}
tmplstr := `<div>{{.safecontent}}</div>`
tmpl, _ := template.new("test").parse(tmplstr)
tmpl.execute(os.stdout, data)
输出结果:
<div><b>加粗文本</b></div>
注册自定义函数到模板中。
func main() {
// 定义自定义函数
funcmap := template.funcmap{
"safehtml": func(s string) template.html {
return template.html(s)
},
}
// 创建模板并注册函数
tmplstr := `<div>{{. | safehtml}}</div>`
tmpl := template.new("test").funcs(funcmap)
tmpl, _ = tmpl.parse(tmplstr)
// 渲染数据
tmpl.execute(os.stdout, "<em>斜体文本</em>")
}
输出结果:
<div><em>斜体文本</em></div>
在模板中实现逻辑控制。
data := struct {
showheader bool
items []string
}{
showheader: true,
items: []string{"go", "python", "java"},
}
tmplstr := `
{{ if .showheader }}<h1>列表</h1>{{ end }}
<ul>
{{ range .items }}
<li>{{ . }}</li>
{{ end }}
</ul>
`
tmpl, _ := template.new("list").parse(tmplstr)
tmpl.execute(os.stdout, data)
输出结果:
<h1>列表</h1> <ul> <li>go</li> <li>python</li> <li>java</li> </ul>
复用模板片段。
// 定义基础模板
tmplstr := `
{{ define "layout" }}
<!doctype html>
<html>
<head>{{ template "title" }}</head>
<body>{{ template "content" . }}</body>
</html>
{{ end }}
{{ define "title" }}<title>默认标题</title>{{ end }}
{{ define "content" }}<p>默认内容</p>{{ end }}
`
// 覆盖部分块
customtmplstr := `
{{ define "content" }}<h1>{{.message}}</h1>{{ end }}
`
// 解析模板
tmpl, _ := template.new("base").parse(tmplstr)
tmpl, _ = tmpl.parse(customtmplstr)
// 渲染数据
data := struct{ message string }{message: "自定义内容"}
tmpl.executetemplate(os.stdout, "layout", data)
输出结果:
<!doctype html> <html> <head><title>默认标题</title></head> <body><h1>自定义内容</h1></body> </html>
parse, parsefiles, execute, funcs。define 和 template)。if、range)。funcs)。到此这篇关于go语言中html/template模块详细功能介绍与示例代码的文章就介绍到这了,更多相关go语言html/template模块内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论