Go语言的模块是专门用于生成安全 HTML 输出的模板引擎,支持自动转义以防止 XSS 攻击。以下是该模块的核心方法及用法示例:
1. 基础模板解析与渲染
template.Parse 和 template.Execute
解析模板字符串并渲染数据。- 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>
复制代码 2. 从文件加载模板
template.ParseFiles
从多个文件加载模板,支持模板继承和嵌套。- // 文件: 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>
复制代码 3. 自动转义与安全内容
自动转义 XSS 内容
默认情况下,所有变量内容会被转义。- 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>
复制代码 信任原始 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)
复制代码 输出结果:4. 自定义模板函数
Funcs 与 template.FuncMap
注册自定义函数到模板中。- 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>")
- }
复制代码 输出结果:5. 条件判断与循环
if 和 range 语法
在模板中实现逻辑控制。- 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>
复制代码 6. 嵌套模板与块定义
define 和 template 指令
复用模板片段。- // 定义基础模板
- 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>
复制代码 总结
- 安全性:自动转义 HTML 特殊字符,防止 XSS 攻击。
- 核心方法:,,,。
- 高级功能:
- 嵌套模板(和)。
- 条件与循环(、)。
- 自定义函数()。
- 适用场景:动态生成安全 HTML 页面,如 Web 应用的后端渲染。
到此这篇关于Go语言中html/template模块详细功能介绍与示例代码的文章就介绍到这了,更多相关Go语言html/template模块内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
来源:互联网
免责声明:如果侵犯了您的权益,请联系站长(1277306191@qq.com),我们会及时删除侵权内容,谢谢合作! |
|