Go语言中html/template模块详细功能介绍与示例

news/2025/4/1 1:21:48/

Go语言的 html/template 模块是专门用于生成安全 HTML 输出的模板引擎,支持自动转义以防止 XSS 攻击。以下是该模块的核心方法及用法示例:


1. 基础模板解析与渲染

template.Parsetemplate.Execute

解析模板字符串并渲染数据。

package mainimport ("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   stringContent string}{Title:   "欢迎页面",Content: "这是安全渲染的内容!",}// 渲染并输出到标准输出err = tmpl.Execute(os.Stdout, data)if err != nil {panic(err)}
}

输出结果

html"><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 stringTitle    string}{SiteName: "我的网站",Title:    "主页",}// 指定使用 "page" 模板渲染err = tmpl.ExecuteTemplate(os.Stdout, "page", data)
}

输出结果

html"><!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)

输出结果

html"><div>&lt;script&gt;alert(&#39;xss&#39;)&lt;/script&gt;</div>
信任原始 HTML

使用 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)

输出结果

html"><div><b>加粗文本</b></div>

4. 自定义模板函数

Funcstemplate.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>")
}

输出结果

html"><div><em>斜体文本</em></div>

5. 条件判断与循环

ifrange 语法

在模板中实现逻辑控制。

data := struct {ShowHeader boolItems      []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)

输出结果

html"><h1>列表</h1>
<ul><li>Go</li><li>Python</li><li>Java</li>
</ul>

6. 嵌套模板与块定义

definetemplate 指令

复用模板片段。

// 定义基础模板
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)

输出结果

html"><!DOCTYPE html>
<html><head><title>默认标题</title></head><body><h1>自定义内容</h1></body>
</html>

总结

  • 安全性:自动转义 HTML 特殊字符,防止 XSS 攻击。
  • 核心方法Parse, ParseFiles, Execute, Funcs
  • 高级功能
    • 嵌套模板(definetemplate)。
    • 条件与循环(ifrange)。
    • 自定义函数(Funcs)。
  • 适用场景:动态生成安全 HTML 页面,如 Web 应用的后端渲染。

http://www.ppmy.cn/news/1584013.html

相关文章

小林coding-12道Spring面试题

1.说一下你对 Spring 的理解?spring的核心思想说说你的理解&#xff1f; 2.Spring IoC和AOP 介绍一下?Spring的aop介绍一下?IOC和AOP是通过什么机制来实现的?怎么理解SpringIoc&#xff1f;依赖倒置&#xff0c;依赖注入&#xff0c;控制反转分别是什么&#xff1f;依赖注…

隐匿视角:七款局域网屏幕监控软件对企业数字神经系统架构的重塑效应探究

在当今竞争激烈的商业环境中&#xff0c;企业管理者对于全面掌握公司运营状况&#xff0c;尤其是员工在工作时间的状态有着强烈需求。局域网屏幕监控技术作为一种有效的管理手段&#xff0c;能够使管理者实时洞察员工的计算机操作行为&#xff0c;从而提升管理效率&#xff0c;…

Web Services 简介

Web Services 简介 概述 Web Services 是一种网络服务技术,允许不同的应用程序通过互联网进行交互和数据交换。随着互联网的普及和发展,Web Services 已经成为企业级应用中不可或缺的一部分。本文将详细介绍 Web Services 的概念、特点、应用场景以及相关的技术架构。 什么…

【C++标准IO库】输出缓冲区的管理

目录 一、输出缓冲区的基本概念 1.1 什么是输出缓冲区 1.2 输出缓冲区的工作原理 1.3 输出缓冲区的优点 1.4 与缓冲区管理相关的函数和类 二、刷新输出缓冲区的方法 2.1 使用操纵符刷新缓冲区 2.2 程序正常结束时刷新缓冲区 2.3 缓冲区满时自动刷新 2.4 使用 setbuf …

数据不互通、审批慢?如何实现多系统智能协同

在企业信息化建设的过程中&#xff0c;数据孤岛和复杂的审批流程常常成为实现高效协同的巨大障碍。对于许多组织来说&#xff0c;面对越来越复杂的业务需求&#xff0c;如何实现多系统智能协同不仅关乎效率&#xff0c;更直接影响企业的竞争力。 数据不互通和审批流程慢的痛点…

李宏毅机器学习笔记06 | 鱼和熊掌可以兼得的机器学习 - 内容接宝可梦

本章提要 深度学习可以在较少参数量的情况下得到比较低的loss&#xff1a; h a l l a r g min ⁡ h ∈ H L ( h , D a l l ) h^{all}arg \min_{h \in H}L(h,D_{all}) hallargminh∈H​L(h,Dall​) 引入 如何权衡模型的复杂程度 Tradeoff of Model Complexity 理论上&#…

投影仪欧盟网络安全EN18031认证,投影仪英国PSTI网络安全测试

投影仪欧盟网络安全EN18031认证&#xff0c;投影仪英国PSTI网络安全测试 随着欧盟市场对无线电设备的网络安全要求不断提升&#xff0c;EN 18031 系列标准应运而生。它并不是传统意义上的“测试性能”标准&#xff0c;而是为了让无线设备在“联网后”也能守好三道防线&#xf…

手机上(ios安卓)如何打开网页控制台

ios 一、基础设置&#xff08;手机端&#xff09; ‌启用Web检查器‌打开手机「设置」→ 选择「Safari浏览器」→ 进入「高级」→ 开启「Web检查器」‌ 二、连接Mac电脑调试&#xff08;需有线连接&#xff09; ‌使用USB连接设备‌将iOS设备通过数据线连接至Mac电脑&#x…