文章目录
golang常用库之-标准库text/template
背景
在许多编程场景中,我们经常需要把数据按照某种格式进行输出,比如生成HTML页面,或者生成配置文件。这时,我们就需要模板引擎的帮助。幸运的是,Go语言在标准库中就提供了两个强大的模板引擎:text/template和html/template。
什么是text/template
text/template
是Go语言标准库中的一个强大工具,用于生成文本输出。它允许你定义模板,然后将数据填充到模板中,非常适合生成报告、配置文件、HTML等。
text/template库的使用
text/template库用于生成任何基于文本的格式。它使用双大括号{{和}}来定义模板的动态部分。让我们通过一个简单的例子来看一下它的使用方法。
- 简单的字符串插值
go
package main
import (
"os"
"text/template"
)
func main() {
// 定义模板
tmpl := template.Must(template.New("test").Parse("你好,{{.Name}}!今天是{{.Date}}。\n"))
// 准备数据
data := struct {
Name string
Date string
}{
Name: "张三",
Date: "2025年5月1日",
}
// 执行模板并输出到标准输出
err := tmpl.Execute(os.Stdout, data)
if err != nil {
panic(err)
}
}
或
go
package main
import (
"os"
"text/template"
)
func main() {
// 显式创建template.Template对象
var tmpl *template.Template
tmpl = template.New("hello")
// 解析模板内容
tmpl, err := tmpl.Parse("你好,{{.Name}}!今天是{{.Date}}。\n")
if err != nil {
panic(err)
}
// 准备数据
data := struct {
Name string
Date string
}{
Name: "张三",
Date: "2025年5月2日",
}
// 执行模板
err = tmpl.Execute(os.Stdout, data)
if err != nil {
panic(err)
}
}
- 使用循环(range)
go
package main
import (
"os"
"text/template"
)
func main() {
// 定义模板
const templateText = `
我的购物清单:
{{range .Items}}
- {{.}}
{{end}}
总计: {{.Count}}项
`
tmpl := template.Must(template.New("list").Parse(templateText))
// 准备数据
data := struct {
Items []string
Count int
}{
Items: []string{"苹果", "香蕉", "橙子", "牛奶"},
Count: 4,
}
// 执行模板
err := tmpl.Execute(os.Stdout, data)
if err != nil {
panic(err)
}
}
- 条件语句(if-else)
go
package main
import (
"os"
"text/template"
)
func main() {
// 定义模板
const templateText = `
{{if .Success}}
✅ 操作成功: {{.Message}}
{{else}}
❌ 操作失败: {{.Message}}
{{end}}
状态码: {{.Code}}
`
tmpl := template.Must(template.New("status").Parse(templateText))
// 准备数据 - 成功案例
success := struct {
Success bool
Message string
Code int
}{
Success: true,
Message: "数据已保存",
Code: 200,
}
// 执行模板
tmpl.Execute(os.Stdout, success)
// 失败案例
failure := struct {
Success bool
Message string
Code int
}{
Success: false,
Message: "服务器错误",
Code: 500,
}
tmpl.Execute(os.Stdout, failure)
}
- 自定义函数
bash
package main
import (
"os"
"strings"
"text/template"
"time"
)
func main() {
// 创建模板并添加自定义函数
funcMap := template.FuncMap{
"upper": strings.ToUpper,
"formatDate": func(t time.Time) string {
return t.Format("2006年01月02日")
},
}
tmpl := template.New("funcs")
tmpl.Funcs(funcMap)
// 解析模板
tmpl, err := tmpl.Parse(`
用户: {{.Name | upper}}
注册时间: {{.RegisterDate | formatDate}}
`)
if err != nil {
panic(err)
}
// 准备数据
data := struct {
Name string
RegisterDate time.Time
}{
Name: "李四",
RegisterDate: time.Date(2024, 3, 15, 0, 0, 0, 0, time.UTC),
}
// 执行模板
err = tmpl.Execute(os.Stdout, data)
if err != nil {
panic(err)
}
}