goctl 技术系列 - Go 模板入门

简介: goctl 技术系列 - Go 模板入门

在 Web 开发中,动态网页是至关重要的一部分,它能够根据用户的请求和数据动态地生成内容。Go 语言通过其强大的标准库提供了一种称为 text/template 的模板引擎,用于构建动态网页和生成文本输出。本文将介绍如何使用 text/template 包来创建和渲染动态网页。

本文为开篇示例,展示简单的模板驱动及其效果,其中 text/template 语法看不懂也没关系,后续篇幅会陆续讲解。

什么是 text/template?

text/templateGo 语言标准库中的一部分,它允许我们定义模板,并通过填充数据来生成输出。这种模板引擎旨在简单而有效地处理文本生成,适合用于生成HTML网页、配置文件、邮件文本等。

准备工作

在开始之前,请确保你已经安装了 Go 语言的开发环境,并理解了基本的 Go 语法和数据结构。

Go 语言安装请移步 https://go.dev/doc/install

Go 语言学习请移步 https://go.dev/learn/

创建你的第一个模板

让我们从一个简单的HTML模板开始。首先新建工程 demo,进入 demo 目录,在 demo 目录下创建一个名为 index.html 的模板文件,并添加以下内容:

<!-- created by go-zero 知识星球 -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>模板示例</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            margin: 20px;
        }
        table {
            width: 100%;
            border-collapse: collapse;
            margin-top: 20px;
        }
        th, td {
            border: 1px solid #dddddd;
            padding: 8px;
            text-align: left;
        }
        th {
            background-color: #f2f2f2;
        }
        tr:nth-child(even) {
            background-color: #f9f9f9;
        }
    </style>
</head>
<body>
<h2>数据展示列表(使用 text/template 模板驱动)</h2>
<table>
    <thead>
    <tr>
        <th>ID</th>
        <th>Name</th>
        <th>Age</th>
        <th>City</th>
    </tr>
    </thead>
    <tbody>
    {{range .}}
    <tr>
        <td>{{.ID}}</td>
        <td>{{.Name}}</td>
        <td>{{.Age}}</td>
        <td>{{.City}}</td>
    </tr>
    {{end}}
    </tbody>
</table>
</body>
</html>

在模板文件 index.html 中,我们使用了 {{.ID}}{{.Name}}{{.Age}}{{.City}} 这样的占位符,它们将在填充数据时被实际的值替代,在未进行数据渲染前,访问 index.html 文件得到的视图如下:

98b1df041686d2f51c2a6cf1ff551e74.png

从视图可以观察到,占位符 {{.ID}}{{.Name}}{{.Age}}{{.City}} 并没有数据填充,接下来我们将进行数据渲染。

在Go程序中使用模板

现在,让我们在Go程序中加载并渲染这个模板。创建一个名为 main.go 的文件,并添加以下代码:

// created by go-zero 知识星球
package main
import (
    "bytes"
    _ "embed"
    "fmt"
    "net/http"
    "text/template"
)
//go:embed index.html
var indexTmpl string
type Person struct {
    ID   int // ID 对应 html 模板中的{{.ID}}占位符变量,严格区分大小写,其他几个字段类似
    Name string
    Age  int
    City string
}
func main() {
    // 注册路由 index,用于渲染 web 页面
    http.HandleFunc("/index", func(writer http.ResponseWriter, request *http.Request) {
       // 模拟数据
       people := []Person{
          {1, "John Doe", 30, "New York"},
          {2, "Jane Smith", 25, "Los Angeles"},
          {3, "Mary Johnson", 35, "Chicago"},
       }
       // 解析模板
       t := template.Must(template.New("webpage").Parse(indexTmpl))
       // 创建一个缓冲区,用于存储渲染后的结果
       renderWriter := bytes.NewBuffer(nil)
       // 执行模板渲染
       err := t.Execute(renderWriter, people)
       if err != nil { // 渲染失败,返回错误信息
          writer.WriteHeader(http.StatusBadRequest)
          _, _ = writer.Write([]byte(err.Error()))
          return
       }
       // 渲染成功,返回渲染后的结果
       writer.WriteHeader(http.StatusOK)
       writer.Header().Set("Content-Type", "text/html; charset=utf-8")
       _, _ = writer.Write(renderWriter.Bytes())
    })
    fmt.Println("Started success, you can visit http://localhost:8080/index to see the result.")
    err := http.ListenAndServe(":8080", nil) // 启动服务
    if err != nil {
       fmt.Println("Starting server error:", err)
    }
}

在这个示例中,people 是一个包含 Person 结构的切片,每个 Person 结构代表表格中的一行数据。模板中使用了 range . 来迭代 people 切片,并为每个 Person 结构生成一行 <tr>

在命令行中使用 go run main.go 运行。访问 http://localhost:8080/index 页面,可以看到输出将是一个包含三行数据的 HTML 表格,每行显示一个人的信息。

1472d7f4739c50f3d1a941e923765ded.png

这种方式使得 HTML 生成更加动态和可扩展,适用于需要根据数据动态生成表格内容的场景。

总结

通过本文,我们探讨了如何利用 Go 语言的 text/template 包构建动态网页。从定义简单的 HTML 模板开始,到在 Go 程序中加载并渲染模板,我们展示了如何通过模板驱动的方式动态生成内容丰富的网页。

text/template 包提供了强大而灵活的工具,使得开发人员能够通过简单的占位符在模板中插入数据,并根据需求动态生成 HTML 输出。这种方法不仅提升了网页内容的个性化和交互性,同时也增强了代码的可维护性和扩展性。

项目地址

https://github.com/zeromicro/go-zero

相关文章
|
2月前
|
人工智能 安全 算法
Go入门实战:并发模式的使用
本文详细探讨了Go语言的并发模式,包括Goroutine、Channel、Mutex和WaitGroup等核心概念。通过具体代码实例与详细解释,介绍了这些模式的原理及应用。同时分析了未来发展趋势与挑战,如更高效的并发控制、更好的并发安全及性能优化。Go语言凭借其优秀的并发性能,在现代编程中备受青睐。
115 33
|
3月前
|
存储 算法 数据可视化
【二叉树遍历入门:从中序遍历到层序与右视图】【LeetCode 热题100】94:二叉树的中序遍历、102:二叉树的层序遍历、199:二叉树的右视图(详细解析)(Go语言版)
本文详细解析了二叉树的三种经典遍历方式:中序遍历(94题)、层序遍历(102题)和右视图(199题)。通过递归与迭代实现中序遍历,深入理解深度优先搜索(DFS);借助队列完成层序遍历和右视图,掌握广度优先搜索(BFS)。文章对比DFS与BFS的思维方式,总结不同遍历的应用场景,为后续构造树结构奠定基础。
188 10
|
3月前
|
存储 算法 物联网
解析局域网内控制电脑机制:基于 Go 语言链表算法的隐秘通信技术探究
数字化办公与物联网蓬勃发展的时代背景下,局域网内计算机控制已成为提升工作效率、达成设备协同管理的重要途径。无论是企业远程办公时的设备统一调度,还是智能家居系统中多设备间的联动控制,高效的数据传输与管理机制均构成实现局域网内计算机控制功能的核心要素。本文将深入探究 Go 语言中的链表数据结构,剖析其在局域网内计算机控制过程中,如何达成数据的有序存储与高效传输,并通过完整的 Go 语言代码示例展示其应用流程。
78 0
|
5月前
|
存储 Go
Go 语言入门指南:切片
Golang中的切片(Slice)是基于数组的动态序列,支持变长操作。它由指针、长度和容量三部分组成,底层引用一个连续的数组片段。切片提供灵活的增减元素功能,语法形式为`[]T`,其中T为元素类型。相比固定长度的数组,切片更常用,允许动态调整大小,并且多个切片可以共享同一底层数组。通过内置的`make`函数可创建指定长度和容量的切片。需要注意的是,切片不能直接比较,只能与`nil`比较,且空切片的长度为0。
133 3
Go 语言入门指南:切片
|
5月前
|
Go C语言
Go语言入门:分支结构
本文介绍了Go语言中的条件语句,包括`if...else`、`if...else if`和`switch`结构,并通过多个练习详细解释了它们的用法。`if...else`用于简单的条件判断;`if...else if`处理多条件分支;`switch`则适用于基于不同值的选择逻辑。特别地,文章还介绍了`fallthrough`关键字,用于优化重复代码。通过实例如判断年龄、奇偶数、公交乘车及成绩等级等,帮助读者更好地理解和应用这些结构。
93 15
|
8月前
|
存储 设计模式 安全
Go语言中的并发编程:从入门到精通###
本文深入探讨了Go语言中并发编程的核心概念与实践技巧,旨在帮助读者从理论到实战全面掌握Go的并发机制。不同于传统的技术文章摘要,本部分将通过一系列生动的案例和代码示例,直观展示Go语言如何优雅地处理并发任务,提升程序性能与响应速度。无论你是Go语言初学者还是有一定经验的开发者,都能在本文中找到实用的知识与灵感。 ###
|
8月前
|
Serverless Go
Go语言中的并发编程:从入门到精通
本文将深入探讨Go语言中并发编程的核心概念和实践,包括goroutine、channel以及sync包等。通过实例演示如何利用这些工具实现高效的并发处理,同时避免常见的陷阱和错误。
|
9月前
|
安全 Go 开发者
破译Go语言中的并发模式:从入门到精通
在这篇技术性文章中,我们将跳过常规的摘要模式,直接带你进入Go语言的并发世界。你将不会看到枯燥的介绍,而是一段代码的旅程,从Go的并发基础构建块(goroutine和channel)开始,到高级模式的实践应用,我们共同探索如何高效地使用Go来处理并发任务。准备好,让Go带你飞。
|
9月前
|
存储 安全 Go
Go语言切片:从入门到精通的深度探索###
本文深入浅出地剖析了Go语言中切片(Slice)这一核心概念,从其定义、内部结构、基本操作到高级特性与最佳实践,为读者提供了一个全面而深入的理解。通过对比数组,揭示切片的灵活性与高效性,并探讨其在并发编程中的应用优势。本文旨在帮助开发者更好地掌握切片,提升Go语言编程技能。 ###
|
9月前
|
安全 测试技术 Go
Python 和 Go 实现 AES 加密算法的技术详解
Python 和 Go 实现 AES 加密算法的技术详解
374 0