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

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

IP如何挑?2025年海外专线IP如何购买?

你花了时间和预算买了IP&#xff0c;结果IP质量不佳&#xff0c;项目效率低下不说&#xff0c;还可能带来莫名的网络问题&#xff0c;是不是太闹心了&#xff1f;尤其是在面对海外专线IP时&#xff0c;到底怎么才能买到适合自己的呢&#xff1f;所以&#xff0c;挑IP绝对是个技…...

掌握 HTTP 请求:理解 cURL GET 语法

cURL 是一个强大的命令行工具&#xff0c;用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中&#xff0c;cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...

深入浅出Diffusion模型:从原理到实践的全方位教程

I. 引言&#xff1a;生成式AI的黎明 – Diffusion模型是什么&#xff1f; 近年来&#xff0c;生成式人工智能&#xff08;Generative AI&#xff09;领域取得了爆炸性的进展&#xff0c;模型能够根据简单的文本提示创作出逼真的图像、连贯的文本&#xff0c;乃至更多令人惊叹的…...

深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏

一、引言 在深度学习中&#xff0c;我们训练出的神经网络往往非常庞大&#xff08;比如像 ResNet、YOLOv8、Vision Transformer&#xff09;&#xff0c;虽然精度很高&#xff0c;但“太重”了&#xff0c;运行起来很慢&#xff0c;占用内存大&#xff0c;不适合部署到手机、摄…...

云原生周刊:k0s 成为 CNCF 沙箱项目

开源项目推荐 HAMi HAMi&#xff08;原名 k8s‑vGPU‑scheduler&#xff09;是一款 CNCF Sandbox 级别的开源 K8s 中间件&#xff0c;通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度&#xff0c;为容器提供统一接口&#xff0c;实现细粒度资源配额…...