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)
    }
}
相关推荐
Lost of 程序猿35 分钟前
责任链模式实战:审批流里“层层把关“的艺术
后端·设计模式·asp.net·责任链模式
X北辰北37 分钟前
C++ 进阶第二阶段总结|STL容器全家桶、迭代器失效、STL算法、序列化入门(工程必备)
开发语言·c++·算法
知守观42 分钟前
Maven SNAPSHOT 更新排查:-U 无效、clean 无用,问题在 _remote.repositories(附完整链路)
java·后端·maven
IT_陈寒1 小时前
一文搞懂SpringBoot的核心概念
前端·人工智能·后端
伯恩bourne1 小时前
对比 @Configuration(Full) vs @Component(Lite)
java·开发语言
软件开发技术深度爱好者1 小时前
ndexTTS-2和 CosyVoice之TTS(Text-to-Speech)使用python示例
开发语言·python
晚枫歌F1 小时前
dpdk实现arp协议,icmp协议-----架构优化
开发语言·javascript·架构
Mikko71 小时前
fastjson 1.2.84 能在 JDK 7 上跑吗?实测:编译能过,一启动就 UnsupportedClassVersionError
java·后端·jdk·fastjson·安全漏洞
G018_star sky♬1 小时前
为什么java新建一个对象,需要obj o = new obj()这种写法
java·开发语言