golang常用库之-标准库text/template

文章目录

golang常用库之-标准库text/template

背景

在许多编程场景中,我们经常需要把数据按照某种格式进行输出,比如生成HTML页面,或者生成配置文件。这时,我们就需要模板引擎的帮助。幸运的是,Go语言在标准库中就提供了两个强大的模板引擎:text/template和html/template。

什么是text/template

text/template是Go语言标准库中的一个强大工具,用于生成文本输出。它允许你定义模板,然后将数据填充到模板中,非常适合生成报告、配置文件、HTML等。

text/template库的使用

text/template库用于生成任何基于文本的格式。它使用双大括号{{和}}来定义模板的动态部分。让我们通过一个简单的例子来看一下它的使用方法。

  1. 简单的字符串插值
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)
    }
}
  1. 使用循环(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)
    }
}
  1. 条件语句(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)
}
  1. 自定义函数
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)
    }
}
相关推荐
wearegogog1232 分钟前
C# 条码打印程序(一维码 + 二维码)
java·开发语言·c#
LaughingDangZi2 分钟前
vue+java分离项目实现微信公众号开发全流程梳理
java·前端·后端
9527(●—●)3 分钟前
windows系统python开发pip命令使用(菜鸟学习)
开发语言·windows·python·学习·pip
神奇小汤圆5 分钟前
RabbitMQ发布订阅模式同一消费者多个实例如何防止重复消费?
后端
松涛和鸣8 分钟前
32、Linux线程编程
linux·运维·服务器·c语言·开发语言·windows
sali-tec9 分钟前
C# 基于halcon的视觉工作流-章69 深度学习-异常值检测
开发语言·图像处理·算法·计算机视觉·c#
leeggco10 分钟前
Batfish Dashboard 项目说明文档
后端
我是唐青枫11 分钟前
深入理解 C#.NET 运算符重载:语法、设计原则与最佳实践
开发语言·c#·.net
qq_124987075335 分钟前
基于springboot健康养老APP的设计与实现(源码+论文+部署+安装)
java·spring boot·后端·mysql·微信小程序·毕业设计
张np38 分钟前
java基础-Deque 接口
java·开发语言