当前位置: 首页 > news >正文

如何在Go中使用模板

引言

您是否需要以格式良好的输出、文本报告或HTML页面呈现一些数据?你可以使用Go模板来做到这一点。任何Go程序都可以使用text/templatehtml/template包(两者都包含在Go标准库中)来整齐地显示数据。

这两个包都允许你编写文本模板并将数据传递给它们,以按你喜欢的格式呈现文档。在模板中,可以遍历数据并使用条件逻辑来决定在文档中包含哪些项以及它们应该如何显示。本教程将向您展示如何使用这两个模板包。首先,你将使用text/template将一些数据渲染为使用循环、条件逻辑和自定义函数的纯文本报告。然后你将使用html/template将相同的数据渲染到一个没有代码注入的html文档中。

前期准备

步骤1 -导入text/template

假设你想要生成一份关于狗的数据的简单报告。你希望像这样显示它:

---
Name:  JujubeSex:   Female (spayed)Age:   10 monthsBreed: German Shepherd/Pitbull---
Name:  ZephyrSex:   Male (intact)Age:   13 years, 3 monthsBreed: German Shepherd/Border Collie

这是你将使用text/template包生成的报告。突出显示的项目是您的数据,其余是来自模板的静态文本。模板要么以字符串的形式存在于代码中,要么与代码放在一起的文件中。它们包含与条件语句(即if/else)、流控制语句(即循环)和函数调用交织在一起的样板静态文本,所有这些都包装在{{. . .}}标记中。您将向模板传递一些数据以渲染像上面那样的最终文档。

首先,导航到你的Go工作空间(go env GOPATH)并为这个项目创建一个新目录:

cd `go env GOPATH`
mkdir pets
cd pets

使用nano或者你最喜欢的文本编辑器,打开一个名为pets.go的新文件并粘贴以下内容:

nano pets.go

pets.go

package mainimport ("os""text/template"
)func main() {
}

这个文件声明自己在main包中,并包含一个main函数,这意味着它可以使用go run运行。它导入了text/template标准库包,以允许你编写和渲染模板,以及os,用于打印到终端。

步骤2 -创建模板数据

在编写模板之前,让我们创建一些数据来传递给模板。在import语句下面,main()语句之前,定义一个名为Pet的结构体,其中包含宠物的NameSex、宠物是否阉割(complete)、AgeBreed字段。编辑pets.go并添加以下结构体:

pets.go

. . .
type Pet struct {Name   stringSex    stringIntact boolAge    stringBreed  string
}
. . .

现在,在main()函数的主体中,创建一个Pet的切片来保存关于两只狗的数据:

pets.go

. . .
func main() {dogs := []Pet{{Name:   "Jujube",Sex:    "Female",Intact: false,Age:    "10 months",Breed:  "German Shepherd/Pitbull",},{Name:   "Zephyr",Sex:    "Male",Intact: true,Age:    "13 years, 3 months",Breed:  "German Shepherd/Border Collie",},}
} // end main

这些数据将被传递到您的模板以渲染最终报告。当然,传递给模板的数据可以来自任何地方:数据库、第三方API等。对于本教程,最简单的方法是将一些示例数据粘贴到代码中。

现在让我们看看如何渲染(用这些包的术语来说就是执行)一个模板。

步骤3 -执行模板

在这一步中,你将看到如何使用text/template从模板生成一个完成的文档,但直到第4步,你才会真正编写一个有用的模板。

创建一个名为pets.tmpl的空文本文件,其中包含一些静态文本:

pets.tmpl

Nothing here yet.

保存模板并退出编辑器。如果你使用的是nano,按下CTRL+X,然后YENTER来确认你的更改。

虽然执行这个模板只会打印“Nothing here yet”。,让我们传入数据并执行模板,只是为了证明text/template是有效的。在你的main()函数中,在dogs切片的后面添加以下代码:

pets.go

	. . .var tmplFile = “pets.tmpl”tmpl, err := template.New(tmplFile).ParseFiles(tmplFile)if err != nil {panic(err)}err = tmpl.Execute(os.Stdout, dogs)if err != nil {panic(err)}
} // end main

在这段代码中,你使用Template.New来创建一个新的Template,然后在生成的模板上调用ParseFiles来解析你的最小模板文件。检查错误后,调用新模板的Execute方法,传入os.Stdout将完成的报告打印到终端,同时传入dogs切片。对于第一个参数,您可以传入任何实现’ io.Writer '接口的东西,例如,您可以将报告写入文件。稍后我们将看到如何做到这一点。

完整的程序看起来应该像这样:

package mainimport ("os""text/template"
)type Pet struct {Name   stringSex    stringIntact boolAge    stringBreed  string
}func main() {dogs := []Pet{{Name:   "Jujube",Sex:    "Female",Intact: false,Age:    "10 months",Breed:  "German Shepherd/Pitbull",},{Name:   "Zephyr",Sex:    "Male",Intact: true,Age:    "13 years, 3 months",Breed:  "German Shepherd/Border Collie",},}var tmplFile = “pets.tmpl”tmpl, err := template.New(tmplFile).ParseFiles(tmplFile)if err != nil {panic(err)}err = tmpl.Execute(os.Stdout, dogs)<

相关文章:

如何在Go中使用模板

引言 您是否需要以格式良好的输出、文本报告或HTML页面呈现一些数据?你可以使用Go模板来做到这一点。任何Go程序都可以使用text/template或html/template包(两者都包含在Go标准库中)来整齐地显示数据。 这两个包都允许你编写文本模板并将数据传递给它们,以按你喜欢的格式呈…...

云原生之深入解析基于FunctionGraph在Serverless领域的FinOps的探索和实践

一、背景 Serverless 精确到毫秒级的按用付费模式使得用户不再需要为资源的空闲时间付费。然而&#xff0c;对于给定的某个应用函数&#xff0c;由于影响其计费成本的因素并不唯一&#xff0c;使得用户对函数运行期间的总计费进行精确的事先估计变成了一项困难的工作。以传统云…...

电子电器架构(E/E)演化 —— 主流主机厂域集中架构概述

电子电器架构(E/E)演化 —— 主流主机厂域集中架构概述 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。…...

Python常用的几个函数

print()函数&#xff1a;用于打印输出信息到控制台。 input()函数&#xff1a;用于从控制台获取用户输入。 len()函数&#xff1a;用于获取字符串、列表、元组、字典等对象的长度。 range()函数&#xff1a;用于生成一个整数序列&#xff0c;常用于循环中。 type()函数&…...

【Linux系统基础】(2)在Linux上部署MySQL、RabbitMQ、ElasticSearch等各类软件

实战章节&#xff1a;在Linux上部署各类软件 前言 为什么学习各类软件在Linux上的部署 在前面&#xff0c;我们学习了许多的Linux命令和高级技巧&#xff0c;这些知识点比较零散&#xff0c;同学们跟随着课程的内容进行练习虽然可以基础掌握这些命令和技巧的使用&#xff0c;…...

HarmonyOS4.0系统性深入开发01应用模型的构成要素

应用模型的构成要素 应用模型是HarmonyOS为开发者提供的应用程序所需能力的抽象提炼&#xff0c;它提供了应用程序必备的组件和运行机制。有了应用模型&#xff0c;开发者可以基于一套统一的模型进行应用开发&#xff0c;使应用开发更简单、高效。 HarmonyOS应用模型的构成要…...

线下终端门店调研包含哪些内容

品牌渠道一般分为线上和线下&#xff0c;线上的价格、促销信息、店铺优惠机制等都可以通过登录查看&#xff0c;但是线下门店的数据则需要进店巡查&#xff0c;否则无法得到真实的店铺销售数据&#xff0c;当然也有品牌是靠线下的业务团队报备机制获得这些信息&#xff0c;但是…...

倾斜摄影三维模型数据在行业应用分析

倾斜摄影三维模型数据在行业应用分析 倾斜摄影三维模型数据是一种重要的地理信息资源&#xff0c;可以广泛应用于各个行业和场景&#xff0c;以解决不同领域的问题。以下将详细探讨几个典型的行业或场景&#xff0c;它们利用倾斜摄影三维模型数据解决问题的应用。 1、地理测绘…...

Apache Flink 进阶教程(七):网络流控及反压剖析

目录 前言 网络流控的概念与背景 为什么需要网络流控 网络流控的实现&#xff1a;静态限速 网络流控的实现&#xff1a;动态反馈/自动反压 案例一&#xff1a;Storm 反压实现 案例二&#xff1a;Spark Streaming 反压实现 疑问&#xff1a;为什么 Flink&#xff08;bef…...

k8s学习 — (DevOps实践)第十三章 DevOps 环境搭建

k8s学习 — &#xff08;DevOps实践&#xff09;第十三章 DevOps 环境搭建 学习资料1 Gitlab1.1 安装 Gitlab1.2 页面配置1.3 配置 Secret1.4 为项目配置 Webhook1.5 卸载 2 Harbor2.1 安装 Harbor2.1 配置 Secret 3 SonarQube3.1 安装 SonarQube3.2 生成服务 token3.3 创建 We…...

Java_Stream流

一、JDK8新特性&#xff08;Stream流&#xff09; 接下来学习一个全新的知识&#xff0c;叫做Stream流&#xff08;也叫Stream API&#xff09;。它是从JDK8以后才有的一个新特性&#xff0c;是专业用于对集合或者数组进行便捷操作的。有多方便呢&#xff1f;我们用一个案例体…...

delphi中,tstringlist使用方法示例

delphi中&#xff0c;tstringlist使用方法示例 在 Delphi 中&#xff0c;TStringList 是一个常用的字符串列表类&#xff0c;它提供了许多用于处理字符串列表的方法。以下是一个示例&#xff0c;演示了如何在 Delphi 中使用 TStringList 类&#xff1a; program TStringListEx…...

【飞凌 OK113i-C 全志T113-i开发板】视频编解码测试

前言 本文测试OK113i-S开发板-视频编解码的功能 OK113i-S开发板是支持视频的编解码的&#xff0c;下面是官方介绍的编解码功能 T113-i 是一种为多媒体解码平台设计的高级应用处理器。T113-i 集成了64位玄铁C906 RISC-V CPU&#xff0c; 双核 Cortex - A7 CPU 和 HiFi4 DSP&a…...

全部没有问题 (一.5)

java mooc练习 基础练习&#xff1a; 进阶练习&#xff1a; final 赋值一次 局部 必须赋值 抽象类 多态测试 package com.book;public class moocDraft1 {static int variable1;public void fatherMethod(moocDraft1 a){System.out.println(variable);}public static void…...

C++归并排序详解以及代码实现

1. 介绍 归并排序&#xff08;Merge Sort&#xff09;是一种采用分治法&#xff08;Divide and Conquer&#xff09;策略的排序算法。该算法首先将已有序的子序列合并&#xff0c;得到完全有序的序列。在归并排序中&#xff0c;合并操作是将两个有序表合并成一个有序表的过程。…...

springboot整合JPA 多表关联 :一对多 多对多

补充一下自定义SQL 这是连表查询&#xff0c;可以任意查出字符&#xff0c;用Map接收 Testvoid test3() {JPAQueryFactory jpaQueryFactory new JPAQueryFactory(em);QStudent student QStudent.student;QMessage message QMessage.message;//constructor(StuMesDto.class, …...

Python 数据分析 Matplotlib篇 plt.rcParams 字典(第5讲)

Python 数据分析 Matplotlib篇 plt.rcParams字典(第5讲)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ�…...

DeamonSet详解

目录 1.1 何为DaemonSet 1.2 DaemonSet 的 API 对象的定义 1.3 DaemonSet实践 1.3.1 创建 DaemonSet 对象 1.3.2 查看 DaemonSet 对象 1.3.3 DaemonSet 版本管理 1.3.4 DaemonSet 的容器镜像版本到 v2.2.0 1.1 何为DaemonSet 介绍DaemonSet我们先来思考一个问题&#x…...

TwIST算法MALTLAB主程序详解

TwIST算法MALTLAB主程序详解 关于TwIST算法的具体原理可以参考&#xff1a; 链接: https://ieeexplore.ieee.org/abstract/document/4358846 链接: https://blog.csdn.net/jbb0523/article/details/52193209 该算法的MATLAB源代码&#xff1a; 链接: http://www.lx.it.pt/~bi…...

Flutter 三: Dart

1 数据类型 数字(number) int double 字符串转换成 num int.parse(“1”) double.parse(“1”);double 四舍五入保留两位小数 toStringAsFixed(2) 返回值为stringdouble 直接舍弃小数点后几位的数据 可使用字符串截取的方式 字符串(string) 单引号 双引号 三引号三引号 可以输…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

NPOI操作EXCEL文件 ——CAD C# 二次开发

缺点:dll.版本容易加载错误。CAD加载插件时&#xff0c;没有加载所有类库。插件运行过程中用到某个类库&#xff0c;会从CAD的安装目录找&#xff0c;找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库&#xff0c;就用插件程序加载进…...

[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG

TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码&#xff1a;HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…...

算术操作符与类型转换:从基础到精通

目录 前言&#xff1a;从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符&#xff1a;、-、*、/、% 赋值操作符&#xff1a;和复合赋值 单⽬操作符&#xff1a;、--、、- 前言&#xff1a;从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...

boost::filesystem::path文件路径使用详解和示例

boost::filesystem::path 是 Boost 库中用于跨平台操作文件路径的类&#xff0c;封装了路径的拼接、分割、提取、判断等常用功能。下面是对它的使用详解&#xff0c;包括常用接口与完整示例。 1. 引入头文件与命名空间 #include <boost/filesystem.hpp> namespace fs b…...