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)
    }
}
相关推荐
nbsaas-boot1 小时前
Java 正则表达式白皮书:语法详解、工程实践与常用表达式库
开发语言·python·mysql
chao_7891 小时前
二分查找篇——搜索旋转排序数组【LeetCode】两次二分查找
开发语言·数据结构·python·算法·leetcode
Nejosi_念旧1 小时前
解读 Go 中的 constraints包
后端·golang·go
风无雨1 小时前
GO 启动 简单服务
开发语言·后端·golang
小明的小名叫小明1 小时前
Go从入门到精通(19)-协程(goroutine)与通道(channel)
后端·golang
光影少年1 小时前
从前端转go开发的学习路线
前端·学习·golang
斯普信专业组1 小时前
Go语言包管理完全指南:从基础到最佳实践
开发语言·后端·golang
我是苏苏3 小时前
C#基础:Winform桌面开发中窗体之间的数据传递
开发语言·c#
一只叫煤球的猫3 小时前
【🤣离谱整活】我写了一篇程序员掉进 Java 异世界的短篇小说
java·后端·程序员
斐波娜娜3 小时前
Maven详解
java·开发语言·maven