当前位置: 首页 > 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) 单引号 双引号 三引号三引号 可以输…...

Stable-Diffusion-v1-5-archive多分辨率实践:512×512 vs 768×768出图质量与耗时对比

Stable-Diffusion-v1-5-archive多分辨率实践&#xff1a;512512 vs 768768出图质量与耗时对比 你是不是也好奇&#xff0c;用Stable Diffusion出图时&#xff0c;分辨率到底该怎么选&#xff1f;是选经典的512512&#xff0c;还是追求更高清的768768&#xff1f;选高了怕电脑跑…...

【Python AI 工具实战宝典】:20个高复用AI用例+开箱即用代码模板,限时开源库清单泄露!

第一章&#xff1a;Python AI 工具生态全景与实战价值定位Python 已成为人工智能开发的事实标准语言&#xff0c;其核心优势不在于单一库的性能&#xff0c;而在于高度协同、分层清晰的工具生态体系。从底层计算&#xff08;NumPy、CuPy&#xff09;、模型构建&#xff08;PyTo…...

RAG的墓志铭:当AI不再需要检索

上个月读到一篇在 Hacker News 上引发热议的文章——《The RAG Obituary: Killed by Agents, Buried by Context Windows》。作者 Nicolas Bustamante 是金融科技公司 Fintool 的创始人&#xff0c;他在文中抛出了一个颇具争议的观点&#xff1a;RAG&#xff08;检索增强生成&a…...

OpenClaw环境隔离方案:ollama-QwQ-32B镜像与本地Python虚拟环境整合

OpenClaw环境隔离方案&#xff1a;ollama-QwQ-32B镜像与本地Python虚拟环境整合 1. 为什么需要环境隔离 上周我在尝试将OpenClaw接入本地部署的ollama-QwQ-32B模型时&#xff0c;遇到了一个棘手的问题&#xff1a;我的开发环境突然崩溃了。事后排查发现&#xff0c;是OpenCla…...

9大核心优势!Outfit字体全方位应用指南:从安装到精通

9大核心优势&#xff01;Outfit字体全方位应用指南&#xff1a;从安装到精通 【免费下载链接】Outfit-Fonts The most on-brand typeface 项目地址: https://gitcode.com/gh_mirrors/ou/Outfit-Fonts Outfit字体作为一款专业开源无衬线字体&#xff0c;凭借9种完整字重体…...

GitHub中文界面终极指南:5分钟让你的GitHub说中文

GitHub中文界面终极指南&#xff1a;5分钟让你的GitHub说中文 【免费下载链接】github-chinese GitHub 汉化插件&#xff0c;GitHub 中文化界面。 (GitHub Translation To Chinese) 项目地址: https://gitcode.com/gh_mirrors/gi/github-chinese 想象一下&#xff0c;你…...

Excel双坐标折线图保姆级教程:用散点图搞定多组数据对比(附详细步骤图)

Excel双坐标折线图进阶指南&#xff1a;用散点图实现精准数据可视化 在数据分析的日常工作中&#xff0c;我们经常遇到需要同时展示两组量纲差异巨大的数据——比如销售额&#xff08;百万级&#xff09;和增长率&#xff08;百分比&#xff09;。传统的双坐标折线图虽然能解决…...

C++ 内存分配器工作原理

C内存分配器工作原理探秘 在C中&#xff0c;动态内存管理是程序性能优化的关键环节&#xff0c;而内存分配器则是幕后英雄。它负责在堆上高效分配和释放内存&#xff0c;直接影响程序的运行效率和资源利用率。无论是标准库中的std::allocator&#xff0c;还是自定义的高性能分…...

二极管限幅与钳位电路设计原理与应用

基于二极管的限幅与钳位电路设计精解1. 二极管基础特性与工程应用1.1 单向导电特性分析二极管作为半导体器件的基础元件&#xff0c;其核心特性是单向导电性。当正向偏置电压超过导通阈值&#xff08;硅管约0.7V&#xff09;时呈现低阻态&#xff0c;反向偏置时则保持高阻态。这…...

企业级流程引擎如何重塑低代码开发?基于Vite+Vue3的可视化建模实践

企业级流程引擎如何重塑低代码开发&#xff1f;基于ViteVue3的可视化建模实践 【免费下载链接】vite-vue-bpmn-process 基于 Vite TypeScript Vue3 NaiveUI Bpmn.js 的流程编辑器&#xff08;前端部分&#xff09;。支持高度自定义&#x1f680;&#x1f680;&#x1f680;。…...