更多個人筆記見:
github個人筆記倉庫
gitee 個人筆記倉庫
個人學習,學習過程中還會不斷補充~ (后續會更新在github上)
文章目錄
- Template 模板
- 基本示例
- 語法
- 1. 基本輸出語法
- 2. 控制結構
- 3. 空白字符控制
- 4. Must函數
Template 模板
基本示例
package mainimport ("fmt""html/template""os"
)// 定義數據結構
type Person struct {Name stringAge intEmail stringIsAdmin bool
}type Company struct {Name stringEmployees []PersonFounded int
}func main() {// 示例1:基本語法演示basicTemplateDemo()// 示例2:條件判斷和循環conditionalAndLoopDemo()// 示例3:HTML模板htmlTemplateDemo()// 示例4:Must的使用mustTemplateDemo()
}// 基本語法演示
func basicTemplateDemo() {fmt.Println("=== 基本語法演示 ===")// {{.}} 表示當前數據對象tmpl1 := `Hello {{.}}!`t1 := template.Must(template.New("basic").Parse(tmpl1))t1.Execute(os.Stdout, "World")fmt.Println()// {{.Name}} 訪問結構體字段person := Person{Name: "張三", Age: 30, Email: "zhangsan@example.com"}tmpl2 := `姓名: {{.Name}}, 年齡: {{.Age}}, 郵箱: {{.Email}}`t2 := template.Must(template.New("person").Parse(tmpl2)) //person 是模板名字t2.Execute(os.Stdout, person) //對應的結構體fmt.Println("\n")
}// 條件判斷和循環演示
func conditionalAndLoopDemo() {fmt.Println("=== 條件判斷和循環演示 ===")company := Company{Name: "科技公司",Founded: 2020,Employees: []Person{{Name: "李四", Age: 25, Email: "lisi@example.com", IsAdmin: true},{Name: "王五", Age: 28, Email: "wangwu@example.com", IsAdmin: false},{Name: "趙六", Age: 32, Email: "zhaoliu@example.com", IsAdmin: false},},}// 使用 {{range .}} 循環和 {{if}} 條件判斷// {{- 和 -}} 用于去除空白字符tmpl := `公司: {{.Name}} (成立于 {{.Founded}}年)員工列表:{{- range .Employees}}- 姓名: {{.Name}}{{- if .IsAdmin}} (管理員){{else}} (普通員工){{end}} 年齡: {{.Age}}, 郵箱: {{.Email}}{{- end}}`//通過IsAdmin 進行判斷是否是管理員t := template.Must(template.New("company").Parse(tmpl))t.Execute(os.Stdout, company) //傳入的 company 是一個大結構體,里面包括 Employees 列表fmt.Println()
}// HTML模板演示
func htmlTemplateDemo() {fmt.Println("=== HTML模板演示 ===")// HTML模板會自動轉義特殊字符htmlTmpl := `
<!DOCTYPE html>
<html>
<head><title>{{.Name}} - 員工列表</title>
</head>
<body><h1>{{.Name}}</h1><p>成立年份: {{.Founded}}</p><h2>員工信息</h2><table border="1"><tr><th>姓名</th><th>年齡</th><th>郵箱</th><th>角色</th></tr>{{- range .Employees}}<tr><td>{{.Name}}</td><td>{{.Age}}</td><td>{{.Email}}</td><td>{{- if .IsAdmin -}}<span style="color: red;">管理員</span>{{- else -}}普通員工{{- end -}}</td></tr>{{- end}}</table>
</body>
</html>
`company := Company{Name: "示例科技公司",Founded: 2020,Employees: []Person{{Name: "張三", Age: 30, IsAdmin: true},{Name: "李四", Age: 25, IsAdmin: false},},}// 創建HTML文件file, err := os.Create("company.html") //創建接收的文件if err != nil {panic(err)}defer file.Close()t := template.Must(template.New("html").Parse(htmlTmpl))t.Execute(file, company) //這里不是 os.stdout輸出了,而是輸出到了文件中fmt.Println("HTML文件已生成: company.html")
}// Must的使用演示
func mustTemplateDemo() {fmt.Println("=== Must使用演示 ===")// Must會在模板解析失敗時直接panic// 這是一個正確的模板validTemplate := `Hello {{.Name}}!`t1 := template.Must(template.New("valid").Parse(validTemplate))person := Person{Name: "測試用戶"}fmt.Print("正確模板輸出: ")t1.Execute(os.Stdout, person)fmt.Println()// 演示錯誤處理(注釋掉以避免程序崩潰)/*// 這是一個錯誤的模板語法,Must會直接panicinvalidTemplate := `Hello {{.Name!` // 缺少右括號t2 := template.Must(template.New("invalid").Parse(invalidTemplate))*/// 不使用Must的錯誤處理方式invalidTemplate := `Hello {{.Name!` //這里缺少了右邊括號 t2, err := template.New("invalid").Parse(invalidTemplate) //沒有用 Must,用 Must 會 panic 導致程序退出if err != nil {fmt.Printf("模板解析錯誤: %v\n", err)} else {t2.Execute(os.Stdout, person)}
}
語法
1. 基本輸出語法
{{.}}
: 輸出當前數據對象{{.Name}}
: 輸出結構體的Name字段{{.Field.SubField}}
: 訪問嵌套字段
2. 控制結構
{{if .IsAdmin}}...{{else}}...{{end}}
: 條件判斷{{range .Employees}}...{{end}}
: 循環遍歷{{with .Field}}...{{end}}
: 設置上下文
3. 空白字符控制
{{-
: 去除左側空白字符-}}
: 去除右側空白字符{{- if .IsAdmin -}}
: 去除兩側空白字符
4. Must函數
template.Must()
: 在模板解析失敗時直接panic- 適用于程序啟動時的模板初始化
- 類似于panic的檢驗機制
- 如果需要接受錯誤就不要用 Must