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

相关文章
|
1月前
|
存储 设计模式 安全
Go语言中的并发编程:从入门到精通###
本文深入探讨了Go语言中并发编程的核心概念与实践技巧,旨在帮助读者从理论到实战全面掌握Go的并发机制。不同于传统的技术文章摘要,本部分将通过一系列生动的案例和代码示例,直观展示Go语言如何优雅地处理并发任务,提升程序性能与响应速度。无论你是Go语言初学者还是有一定经验的开发者,都能在本文中找到实用的知识与灵感。 ###
|
1月前
|
Serverless Go
Go语言中的并发编程:从入门到精通
本文将深入探讨Go语言中并发编程的核心概念和实践,包括goroutine、channel以及sync包等。通过实例演示如何利用这些工具实现高效的并发处理,同时避免常见的陷阱和错误。
|
2月前
|
安全 Go 开发者
破译Go语言中的并发模式:从入门到精通
在这篇技术性文章中,我们将跳过常规的摘要模式,直接带你进入Go语言的并发世界。你将不会看到枯燥的介绍,而是一段代码的旅程,从Go的并发基础构建块(goroutine和channel)开始,到高级模式的实践应用,我们共同探索如何高效地使用Go来处理并发任务。准备好,让Go带你飞。
|
2月前
|
存储 安全 Go
Go语言切片:从入门到精通的深度探索###
本文深入浅出地剖析了Go语言中切片(Slice)这一核心概念,从其定义、内部结构、基本操作到高级特性与最佳实践,为读者提供了一个全面而深入的理解。通过对比数组,揭示切片的灵活性与高效性,并探讨其在并发编程中的应用优势。本文旨在帮助开发者更好地掌握切片,提升Go语言编程技能。 ###
|
2月前
|
安全 测试技术 Go
Python 和 Go 实现 AES 加密算法的技术详解
Python 和 Go 实现 AES 加密算法的技术详解
129 0
|
3月前
|
消息中间件 NoSQL Go
PHP转Go系列 | ThinkPHP与Gin框架之Redis延时消息队列技术实践
【9月更文挑战第7天】在从 PHP 的 ThinkPHP 框架迁移到 Go 的 Gin 框架时,涉及 Redis 延时消息队列的技术实践主要包括:理解延时消息队列概念,其能在特定时间处理消息,适用于定时任务等场景;在 ThinkPHP 中使用 Redis 实现延时队列;在 Gin 中结合 Go 的 Redis 客户端库实现类似功能;Go 具有更高性能和简洁性,适合处理大量消息。迁移过程中需考虑业务需求及系统稳定性。
|
4月前
|
搜索推荐 Go UED
揭秘 Go 中的模板:一份全面而广泛的指南
揭秘 Go 中的模板:一份全面而广泛的指南
|
4月前
|
Unix Go
Go从入门到放弃之时间操作
Go从入门到放弃之时间操作
|
4月前
|
机器学习/深度学习 移动开发 Linux
Go从入门到放弃之文件操作
Go从入门到放弃之文件操作
|
4月前
|
Java Go PHP
Go从入门到放弃之错误处理
Go从入门到放弃之错误处理
下一篇
DataWorks