# 简介`html/template` 是 Go 语言标准库中的一个包,用于处理 HTML 模板。模板是一种特殊的文本文件,可以包含可执行的代码片段(称为动作),这些代码片段在模板被解析和渲染时执行。`html/template` 包提供了一种安全的方式来生成 HTML 输出,它会自动转义任何潜在的恶意输入,从而防止跨站脚本攻击(XSS)。# 多级标题## 安装与导入`html/template` 是 Go 语言的标准库之一,因此无需单独安装。使用时只需导入该包即可:```go import "html/template" ```## 基本概念### 模板定义模板定义通常是一个字符串,其中包含一些特定的标记,这些标记将在运行时被替换为实际的数据。例如,以下是一个简单的模板:```go templateStr := `
{{.Title}}
{{.Content}}
` ```在这个例子中,`{{.Title}}` 和 `{{.Content}}` 是模板中的占位符,它们会在渲染时被替换为相应的数据。### 数据模型模板中的数据可以通过结构体、映射或其他类型来传递。例如:```go type Page struct {Title stringContent string } ```### 渲染模板要将数据填充到模板中并生成最终的 HTML 输出,可以使用 `Parse` 函数解析模板字符串,然后使用 `Execute` 或 `ExecuteTemplate` 方法来渲染模板:```go t, err := template.New("test").Parse(templateStr) if err != nil {log.Fatal(err) }page := Page{Title: "My Page",Content: "Welcome to my page!", }err = t.Execute(os.Stdout, page) if err != nil {log.Fatal(err) } ```## 高级特性### 模板继承`html/template` 支持模板继承,允许定义基模板并在子模板中扩展或覆盖部分。这使得维护大型网站的公共布局变得更加容易。### 助手函数你可以向模板添加自定义函数,这些函数可以在模板中调用。例如,可以添加一个函数来格式化日期:```go func formatDate(date time.Time) string {return date.Format("2006-01-02") }tmpl.Funcs(template.FuncMap{"formatDate": formatDate}) ```### 条件和循环模板支持条件语句和循环语句,这使得复杂的输出变得简单。例如:```go {{if .Items}}-
{{range .Items}}
- {{.Name}} {{end}}
{{.Title}}
{{.Content}}
Published on {{formatDate .Date}}
-
{{range .Items}}
- {{.Name}} {{end}}
简介`html/template` 是 Go 语言标准库中的一个包,用于处理 HTML 模板。模板是一种特殊的文本文件,可以包含可执行的代码片段(称为动作),这些代码片段在模板被解析和渲染时执行。`html/template` 包提供了一种安全的方式来生成 HTML 输出,它会自动转义任何潜在的恶意输入,从而防止跨站脚本攻击(XSS)。
多级标题
安装与导入`html/template` 是 Go 语言的标准库之一,因此无需单独安装。使用时只需导入该包即可:```go import "html/template" ```
基本概念
模板定义模板定义通常是一个字符串,其中包含一些特定的标记,这些标记将在运行时被替换为实际的数据。例如,以下是一个简单的模板:```go templateStr := `
{{.Title}}
{{.Content}}
` ```在这个例子中,`{{.Title}}` 和 `{{.Content}}` 是模板中的占位符,它们会在渲染时被替换为相应的数据。数据模型模板中的数据可以通过结构体、映射或其他类型来传递。例如:```go type Page struct {Title stringContent string } ```
渲染模板要将数据填充到模板中并生成最终的 HTML 输出,可以使用 `Parse` 函数解析模板字符串,然后使用 `Execute` 或 `ExecuteTemplate` 方法来渲染模板:```go t, err := template.New("test").Parse(templateStr) if err != nil {log.Fatal(err) }page := Page{Title: "My Page",Content: "Welcome to my page!", }err = t.Execute(os.Stdout, page) if err != nil {log.Fatal(err) } ```
高级特性
模板继承`html/template` 支持模板继承,允许定义基模板并在子模板中扩展或覆盖部分。这使得维护大型网站的公共布局变得更加容易。
助手函数你可以向模板添加自定义函数,这些函数可以在模板中调用。例如,可以添加一个函数来格式化日期:```go func formatDate(date time.Time) string {return date.Format("2006-01-02") }tmpl.Funcs(template.FuncMap{"formatDate": formatDate}) ```
条件和循环模板支持条件语句和循环语句,这使得复杂的输出变得简单。例如:```go {{if .Items}}
-
{{range .Items}}
- {{.Name}} {{end}}
安全性由于 `html/template` 自动转义所有插入的内容,这大大降低了 XSS 攻击的风险。但是,仍然需要确保所有外部输入都经过适当的验证和清理。
内容详细说明
示例下面是一个完整的示例,演示如何创建和使用一个简单的模板:```go package mainimport ("fmt""html/template""log""os""time" )type Page struct {Title stringContent stringDate time.TimeItems []Item }type Item struct {Name string }func formatDate(date time.Time) string {return date.Format("2006-01-02") }func main() {templateStr := `
{{.Title}}
{{.Content}}
Published on {{formatDate .Date}}
-
{{range .Items}}
- {{.Name}} {{end}}