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)
    }
}
相关推荐
寻觅~流光24 分钟前
封装---优化try..catch错误处理方式
开发语言·前端·javascript·typescript
小李飞飞砖29 分钟前
JVM 锁自动升级机制详解
开发语言·jvm·c#
蹦蹦跳跳真可爱58936 分钟前
Python----NLP自然语言处理(中文分词器--jieba分词器)
开发语言·人工智能·python·自然语言处理·中文分词
蹦蹦跳跳真可爱5891 小时前
Python----OpenCV(图像分割——彩色图像分割,GrabCut算法分割图像)
开发语言·图像处理·人工智能·python·opencv·计算机视觉
越城1 小时前
C++类与对象(上)
开发语言·c++
mit6.8241 小时前
[Nagios Core] struct监控对象 | 配置.cfg加载为内存模型
c语言·开发语言
程序员爱钓鱼1 小时前
Go语言统计字符串中每个字符出现的次数 — 简易频率分析器
后端·google·go
Code季风1 小时前
深度优化 spring 性能:从缓存、延迟加载到并发控制的实战指南
java·spring boot·后端·spring·缓存·性能优化
序属秋秋秋1 小时前
《C++初阶之STL》【泛型编程 + STL简介】
开发语言·c++·笔记·学习
风象南2 小时前
SpringBoot自定义RestTemplate的拦截器链
java·spring boot·后端