如何在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)<

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/536800.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

“C语言“——scanf()、getchar() 、putchar()、之间的关系

scanf函数说明 scanf函数是对来自于标准输入流的输入数据作格式转换&#xff0c;并将转换结果保存至format后面的实参所指向的对象。 而const char*format 指向的字符串为格式控制字符串&#xff0c;它指定了可输入的字符串以及赋值时转换方法。 简单来说给一个打印格式(输入…

【并发编程篇】源码分析,手动创建线程池

文章目录 &#x1f6f8;前言&#x1f339;Executors的三大方法 &#x1f354;简述线程池&#x1f386;手动创建线程池⭐源码分析✨代码实现&#xff0c;手动创建线程池&#x1f388;CallerRunsPolicy()&#x1f388;AbortPolicy()&#x1f388;DiscardPolicy()&#x1f388;Dis…

LNPMariadb数据库分离|web服务器集群

LNP&Mariadb数据库分离&#xff5c;web服务器集群 网站架构演变单机版LNMP独立数据库服务器web服务器集群与Session保持 LNP与数据库分离1. 准备一台独立的服务器&#xff0c;安装数据库软件包2. 将之前的LNMP网站中的数据库迁移到新的数据库服务器3. 修改wordpress网站配置…

2023.12.24 关于 Redis 中 String 类型内部编码 及 应用场景

目录 String 类型内部编码 3 种内部编码方式 String 类型应用场景 Cache 缓存 键名命名规则 计数&#xff08;Counter&#xff09; 共享会话&#xff08;Session &#xff09; 手机验证码 总结 String 类型内部编码 3 种内部编码方式 int&#xff1a;用来表示 64 位 —…

vue3菜单权限管理实现

前提 你的菜单是根据路由动态生成的&#xff0c;具体可以参考这篇博客对el-menu组件进行递归封装&#xff08;根据路由配置动态生成&#xff09; 描述 首先将路由分为常量路由constantRoute&#xff08;所有用户都有的路由&#xff09;和异步路由asyncRoute&#xff08;需要动…

Gradle 插件

自定义Gradle插件 - 简书

小天使的小难题:新生儿疝气的关注与温馨呵护

引言&#xff1a; 新生儿疝气是一种在出生后可能出现的常见情况&#xff0c;虽然通常不会造成长期影响&#xff0c;但对于家长而言&#xff0c;了解如何正确应对新生儿疝气是至关重要的。本文将深入探讨新生儿疝气的原因、症状&#xff0c;以及家长在面对这一问题时应该采取的…

1224. 交换瓶子(蓝桥杯/图论)

题目&#xff1a; 1224. 交换瓶子 - AcWing题库 输入样例1&#xff1a; 5 3 1 2 5 4输出样例1&#xff1a; 3输入样例2&#xff1a; 5 5 4 3 2 1输出样例2&#xff1a; 2 思路&#xff1a;图论 1.将对应的位置与当前的瓶子序列相连形成环。 2.最少交换次数能形成的最多…

Vue中的事件委托(事件代理)使用方法介绍

事件委托&#xff08;事件代理&#xff09; 将原本需要绑定在子元素上的事件监听器委托在父元素上&#xff0c;让父元素充当事件监听的职务。 事件委托是一种利用事件冒泡的特性&#xff0c;在父节点上响应事件&#xff0c;而不是在子节点上响应事件的技术。它能够改善性能&a…

如何理解JDK、JRE、JVM区别与联系

摘要&#xff1a;JDK是 Java 语言的软件开发工具包(SDK)。在JDK的安装目录下有一个jre目录&#xff0c;里面有两个文件夹bin和lib&#xff0c;在这里可以认为bin里的就是jvm&#xff0c;lib中则是jvm工作所需要的类库&#xff0c;而jvm和 lib合起来就称为jre。 一、JDK JDK(Ja…

【【迭代16次的CORDIC算法-verilog实现】】

迭代16次的CORDIC算法-verilog实现 -32位迭代16次verilog代码实现 CORDIC.v module cordic32#(parameter DATA_WIDTH 8d32 , // we set data widthparameter PIPELINE 5d16 // Optimize waveform)(input …

第十四章Java博客

lambda就是数学中的“λ”的读音&#xff0c;lambda表达式是基于λ演算而得名的&#xff0c;因为lambda抽象&#xff08;lambda abstraction&#xff09;表示一个匿名的函数&#xff0c;于是开发语言也将lambda表达式用来表示匿名函数&#xff0c;也就是没有函数名字的函数。C#…

maven管理工具使用package打包的时候无法将lib文件夹下的第三方jar包打入,上线打jar包后运行异常问题

问题描述&#xff1a; 调用第三方接口的时候通过手动引入了第三方的两个jar包到我本项目的lib文件夹下&#xff0c;并在pom文件添加入下配置&#xff1a; <dependency><groupId>cn.xxxx.xxxx.core</groupId><artifactId>xxxx-core</artifactId>…

Spring Boot 中实现跨域的几种方式

前言 在现代Web应用中&#xff0c;由于安全性和隐私的考虑&#xff0c;浏览器限制了从一个域向另一个域发起的跨域HTTP请求。解决这个问题的一种常见方式是实现跨域资源共享&#xff08;CORS&#xff09;。Spring Boot提供了多种方式来处理跨域请求&#xff0c;本文将介绍其中的…

C语言字符串处理提取时间(ffmpeg返回的时间字符串)

【1】需求 需求&#xff1a;有一个 “00:01:33.90” 这样格式的时间字符串&#xff0c;需要将这个字符串的时间值提取打印出来&#xff08;提取时、分、秒、毫秒&#xff09;。 这个时间字符串从哪里来的&#xff1f; 是ffmpeg返回的时间&#xff0c;也就是视频的总时间。 下…

vs快捷键

ctrlMo 折叠代码块 ctrlML 打开代码块

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

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

系列七(实战)、发送 接收单向消息(Java操作RocketMQ)

一、发送 & 接收单向消息 1.1、概述 发送单向消息&#xff0c;适用于发送方不关心或者不在意消息的发送结果&#xff0c;这种方式的吞吐量很大&#xff0c;但是存在消息丢失的风险&#xff0c;对于重要消息要慎用&#xff01;该种方式通常适用于对消息没有那么严格的场景中…

类和对象的创建和实例化

1. 类的概述 1.1 具体示例 类是描述一类事物的特征和行为的统称&#xff0c;抽象的不存在的&#xff0c;泛指的概念&#xff0c;例如&#xff1a;描述一个人&#xff0c;从外观上&#xff08;特征&#xff09;和言行举止&#xff08;行为&#xff09;上进行描述外观上&#xff…

c 语言学习:输出阶乘的算式

c 语言学习&#xff1a;输出阶乘的算式 代码 #include "stdio.h"int fact(int num){if (num < 1){printf("1 ");return 1;} else {printf("%d x ",num);return num * fact(num-1);} }int main(){int num 10; // printf("plz inpu…