Go 语言Web开发-模板(template)快速入门教程

模板基础

Go语言模板包是用于生成文本输出的工具,它通过解析模板文本并结合数据生成最终的输出文本。模板语法简洁而强大,包括模板标记、变量输出、控制结构和模板函数等。模板对象表示已解析和编译的模板,可以执行并输出最终文本。模板包的工作原理主要包括模板解析、数据传递和模板执行三个步骤。

text/templatehtml/template 是 Go 语言模板包的两个子包,用于生成文本输出和 HTML 输出。

  • text/template 用于生成任意文本格式的模板,不会自动对输出内容进行 HTML 转义。
  • html/template 专门用于生成 HTML 文档的模板,会自动对输出内容进行 HTML 转义,防止 XSS 攻击。

在浏览器中展示 text/template 的输出时,浏览器也会进行 HTML 转义。这是因为浏览器默认会将接收到的文本内容视为 HTML,从而进行相应的转义处理。因此,无论是 text/template 还是 html/template 生成的内容,在浏览器中显示时都会经过 HTML 转义。所以一般推荐使用

text/template

模板使用

  1. 导入模板库
import "text/template"
  1. 定义模板
const textTemplate = "Hello, {{.Name}}! Today is {{.Day}}."

或准备模板文件index.tmpl

Hello, {{.Name}}! Today is {{.Day}}.
  1. 解析模板

解析定义的模板

tmpl, err := template.New("text_template").Parse(textTemplate)
if err != nil {panic(err)
}

或者解析本地准备好的模板文件index.tmpl

tmpl, err := template.ParseFiles("index.tmpl")
if err != nil {panic(err)
}
  1. 准备数据
data := struct {Name stringDay  string
}{Name: "Alice",Day:  "Monday",
}
  1. 执行模板
err = tmpl.Execute(os.Stdout, data)
if err != nil {panic(err)
}

完成代码示例

package mainimport ("os""text/template"
)func main() {tmpl, _ := template.ParseFiles("index.tmpl")data := struct {Name stringDay  string}{"Alice", "Monday"}tmpl.Execute(os.Stdout, data)	// 输出至控制台
}
// Hello, Alice! Today is Monday.

这里需要注意的是模板文件的扩展名可以自定义,一般是.html.tmpl等。

函数说明

// 创建一个名为name的模板
func New(name string) *Template// ParseFiles函数创建一个模板并解析filenames指定的文件里的模板定义【推荐使用】
func ParseFiles(filenames ...string) (*Template, error)// Must函数用于包装返回(*Template, error)的函数/方法调用,它会在err非nil时panic,一般用于变量初始化
func Must(t *Template, err error) *Template// ParseGlob创建一个模板并解析匹配pattern的文件(参见glob规则)里的模板定义
func ParseGlob(pattern string) (*Template, error)// Parse方法将字符串text解析为模板
func (t *Template) Parse(text string) (*Template, error)// ParseFiles方法解析匹配pattern的文件里的模板定义并将解析结果与t关联
func (t *Template) ParseFiles(filenames ...string) (*Template, error)// ParseGlob方法解析filenames指定的文件里的模板定义并将解析结果与t关联
func (t *Template) ParseGlob(pattern string) (*Template, error)// Execute方法将解析好的模板应用到data上,并将输出写入wr
func (t *Template) Execute(wr io.Writer, data interface{}) (err error)

模板语法

模板语法也叫Action,在 Go 的模板包中非常灵活,它包括了标记、变量输出、控制结构和模板函数等功能。模板语法中的标记使用双花括号 {{ }} 包裹,例如 {{.FieldName}} 表示输出数据结构中的某个字段。

注释

{{/* a comment */}}
注释,执行时会忽略。可以多行。注释不能嵌套,并且必须紧贴分界符始止。

管道

管道(pipeline)是指产生数据的操作。比如{{.}}{{.Name}}等。Go的模板语法中支持使用管道符号|链接多个命令,用法和unix下的管道类似:|前面的命令会将运算结果(或返回值)传递给后一个命令的最后一个位置。

注意 : 并不是只有使用了|才是pipeline。Go的模板语法中,pipeline的概念是传递数据,只要能产生数据的,都是pipeline。

变量

{{ $variable := pipeline }}

Action里可以初始化一个变量来捕获管道的执行结果,变量名以$开头。

条件判断

{{if pipeline}} T1 {{end}}{{if pipeline}} T1 {{else}} T0 {{end}}{{if pipeline}} T1 {{else if pipeline}} T0 {{end}}

这里的pipeline均为布尔表达式。

循环

{{range pipeline}} T1 {{end}}
如果pipeline的值其长度为0,不会有任何输出{{range pipeline}} T1 {{else}} T0 {{end}}
如果pipeline的值其长度为0,则会执行T0。

with局部域

{{with pipeline}} T1 {{end}}
如果pipeline为empty不产生输出,否则将dot设为pipeline的值并执行T1。不修改外面的dot。{{with pipeline}} T1 {{else}} T0 {{end}}
如果pipeline为empty,不改变dot并执行T0,否则dot设为pipeline的值并执行T1。

模板函数

常见模板函数

and函数返回它的第一个empty参数或者最后一个参数;就是说"and x y"等价于"if x then y else x";所有参数都会执行;
or返回第一个非empty参数或者最后一个参数;亦即"or x y"等价于"if x then x else y";所有参数都会执行;
not返回它的单个参数的布尔值的否定
len返回它的参数的整数类型长度
index执行结果为第一个参数以剩下的参数为索引/键指向的值;如"index x 1 2 3"返回x[1][2][3]的值;每个被索引的主体必须是数组、切片或者字典。
print即fmt.Sprint
printf即fmt.Sprintf
println即fmt.Sprintln
html返回其参数文本表示的HTML逸码等价表示。
urlquery返回其参数文本表示的可嵌入URL查询的逸码等价表示。
js返回其参数文本表示的JavaScript逸码等价表示。
call执行结果是调用第一个参数的返回值,该参数必须是函数类型,其余参数作为调用该函数的参数;如"call .X.Y 1 2"等价于go语言里的dot.X.Y(1, 2);其中Y是函数类型的字段或者字典的值,或者其他类似情况;call的第一个参数的执行结果必须是函数类型的值(和预定义函数如print明显不同);该函数类型值必须有1到2个返回值,如果有2个则后一个必须是error接口类型;如果有2个返回值的方法返回的error非nil,模板执行会中断并返回给调用模板执行者该错误;

比较函数

eq      如果arg1 == arg2则返回真
ne      如果arg1 != arg2则返回真
lt      如果arg1 < arg2则返回真
le      如果arg1 <= arg2则返回真
gt      如果arg1 > arg2则返回真
ge      如果arg1 >= arg2则返回真

自定义函数

func (t *Template) Funcs(funcMap FuncMap) *Template

Funcs方法向模板t的函数字典里加入参数funcMap内的键值对。如果funcMap某个键值对的值不是函数类型或者返回值不符合要求会panic。但是,可以对t函数列表的成员进行重写。方法返回t以便进行链式调用。

模板嵌套

通过 {{ define "blockName" }} ... {{ end }} 定义模板块,并在其他模板中使用 {{ template "blockName" }} 来引用模板块,实现模板的继承和组合。

index.tmpl

{{template "navbar" .}}{{template "content" .}}{{template "footer" .}}

navbar.tmpl

{{define "navbar"}}
<nav>Navbar
</nav>
{{end}}

content.tmpl

{{define "content"}}
<div>content
</div>
{{end}}

footer.tmpl

{{define "footer"}}
<footer>footer
</footer>
{{end}}

一次性导入上述模板文件

tmpl := template.Must(template.ParseFiles("index.tmpl", "navbar.tmpl", "content.tmpl","footer.tmpl"))

如果模板文件里有引用其他本地静态资源文件得先开启文件服务器

http.Handle("/assets/", http.StripPrefix("/assets/", http.FileServer(http.Dir("assets"))))

如模板文件里引用了assets文件夹里的资源,则需要对其开启文件服务器

<link rel="stylesheet" href="./assets/css/style.css">
<script src="./assets/src/main.js"></script>

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

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

相关文章

React【Day1】

B站视频链接 一、React介绍 React由Meta公司开发&#xff0c;是一个用于 构建Web和原生交互界面的库 React的优势 相较于传统基于DOM开发的优势 组件化的开发方式不错的性能 相较于其它前端框架的优势 丰富的生态跨平台支持 React的市场情况 全球最流行&#xff0c;大…

nginx的location规则与其他功能

1. nginx中location规则&#xff1a; 规则描述~表示执行一个正则匹配&#xff0c;区分大小写~*表示执行一个正则匹配&#xff0c;不区分大小写^~表示普通字符匹配&#xff0c;如果该选项匹配&#xff0c;只匹配该选项&#xff0c;不匹配别的选项&#xff0c;一般用来匹配目录进…

pandas读写excel,csv

1.读excel 1.to_dict() 函数基本语法 DataFrame.to_dict (self, orientdict , into ) --- 官方文档 函数种只需要填写一个参数&#xff1a;orient 即可 &#xff0c;但对于写入orient的不同&#xff0c;字典的构造方式也不同&#xff0c;官网一共给出了6种&#xff0c…

API(时间类)

一、Date类 java.util.Date类 表示特定的瞬间&#xff0c;精确到毫秒。 Date常用方法&#xff1a; public long getTime() 把日期对象转换成对应的时间毫秒值。 public void setTime(long time) 把方法参数给定的毫秒值设…

python网络爬虫实战教学——requests的使用(1)

文章目录 专栏导读1、前言2、get请求3、抓取网页4、抓取二进制数据5、请求头 专栏导读 ✍ 作者简介&#xff1a;i阿极&#xff0c;CSDN 数据分析领域优质创作者&#xff0c;专注于分享python数据分析领域知识。 ✍ 本文录入于《python网络爬虫实战教学》&#xff0c;本专栏针对…

部署Prometheus+grafana详解

目录 一、prometheus 介绍 二、prometheus 对比 zabbix 三、prometheus 监控插件 四、部署 1、下载所需的包 2.编辑prometheus的配置文件 3、编辑alertmanager 的配置文件 4、tmpl 模板&#xff08;将此文件创建在/opt/alertmanager/tmpl/&#xff09; 5.启动&#xff0…

探索国内ip切换App:打破网络限制

在国内网络环境中&#xff0c;有时我们会遇到一些限制或者屏蔽&#xff0c;使得我们无法自由访问一些网站或服务。而国内IP切换App的出现&#xff0c;为解决这些问题提供了非常便捷的方式。这些App可以帮助用户切换IP地址&#xff0c;让用户可以轻松地访问被限制或屏蔽的网站&a…

leetcode刷题(javaScript)——BFS广度优先遍历相关场景题总结

广度优先搜索&#xff08;BFS&#xff09;在JavaScript编程中有许多实际应用场景&#xff0c;特别是在解决图、树等数据结构相关问题时非常常见。在JavaScript中&#xff0c;可以使用队列来实现广度优先搜索算法。通过将起始节点加入队列&#xff0c;然后迭代地将节点的邻居节点…

css background-color属性无效

因为工作需要&#xff0c;最近在帮H5同事开发几个页面&#xff0c;在使用H5进行如下布局的时候&#xff0c;发现设置 background-color为白色无效。 代码如下&#xff1a; <div class "bottomBar"><div style"position: fixed; left: 20px;">…

精细化运维与用户权限管理的全新升级

在当今数字化时代&#xff0c;企业对IT运维的需求日益增长&#xff0c;尤其是对于用户权限和设备管理的精细化控制。为了满足这些需求&#xff0c;监控易运维系统最近进行了一次重大的升级&#xff0c;特别是在用户权限管理和运维可视化方面取得了显著的进步。 在用户权限管理方…

同步服务器操作系统公网仓库到本地02--搭建http内网仓库源 _ 麒麟KOS _ 统信UOS _ 中科方德 NFSCNS

原文链接&#xff1a;同步服务器操作系统公网仓库到本地02 —搭建http内网仓库源| 麒麟KOS | 统信UOS | 中科方德 NFSCNS Hello&#xff0c;大家好啊&#xff01;继之前我们讨论了如何同步服务器公网仓库到本地服务器之后&#xff0c;今天我们将进入这个系列的第二篇文章——通…

美容美发行业在线下单小程序源码系统 一键在线预约 带完整的安装代码包以及安装部署教程

近年来&#xff0c;美容美发市场竞争日益激烈&#xff0c;传统的经营模式已难以满足消费者的多样化需求。为了适应市场变化&#xff0c;提升服务质量&#xff0c;许多商家开始寻求数字化转型。然而&#xff0c;由于技术门槛较高&#xff0c;很多商家在开发在线预约系统时遇到了…

中兴通讯服务器荣获滴滴“最佳需求响应「和衷共济」奖”

在数字经济加速发展的背景下&#xff0c;算力成为数字产业的核心支撑力量&#xff0c;而服务器和存储产品更是为互联网创新体验提供了底层基础设施保障。在此背景下&#xff0c;中兴通讯服务器产品有效支撑滴滴出行智慧交通解决方案&#xff0c;凭借卓越表现&#xff0c;获得滴…

StarRocks-2.5.13部署安装

1、安装jdk11 tar xf jdk-11.0.16.1_linux-x64_bin.tar.gz mv jdk-11.0.16.1 /data/soft/jdk-11 # 配置在/etc/profile中 export JAVA_HOME/data/soft/jdk-11 export CLASSPATH.:/data/soft/jdk-11/lib export PATH/data/soft/jdk-11/bin:$PATH # 验证jdk [rootdb-public-03 s…

实验8-2-9 长整数转化成16进制字符串(PTA)

题目&#xff1a; 本题要求实现一个将长整数转化成16进制字符串的简单函数。 函数接口定义&#xff1a; void f( long int x, char *p );其中x是待转化的十进制长整数&#xff0c;p指向某个字符数组的首元素。函数f的功能是把转换所得的16进制字符串写入p所指向的数组。16进…

大广赛获奖作品一览

大广赛指全国大学生广告艺术大赛&#xff0c;这是一项由中国教育部高等教育司指导、中国高等教育学会广告教育专业委员会主办的全国性高校文科大赛&#xff0c;也是迄今为止全国规模大、覆盖高等院校广、参与师生人数多、作品水准高的国家级大学生赛事。 大广赛的竞赛形式主要…

每天学习几道面试题|Kafka(三) 应用场景和性能调优类

文章目录 1. Kafka 在哪些场景下比较适用&#xff1f;2. 如何在 Kafka 中实现消息的顺序性&#xff1f;3. 如何实现消息的 Exactly-Once 语义&#xff1f;4. Kafka 的性能调优有哪些方面需要注意&#xff1f;5. Kafka 和其他消息队列系统&#xff08;比如 RabbitMQ、ActiveMQ 等…

vue 隐藏导航栏和菜单栏

初始效果&#xff1a; 效果&#xff1a;

梦百合发布“正确睡眠观”,再次呼吁“别睡硬床”

3月21日“世界睡眠日”当天,MLILY梦百合召开了主题为“别睡硬床”的品牌发布会,梦百合家居董事长倪张根发布了一场线上主题演讲,普及睡硬床可能带来的危害,呼吁国人“别睡硬床!”,并发布“100万张硬床垫改造计划”,期望消费者通过从体验一张薄垫开始,从而逐步认识到睡硬床的危害…

Go——map

一.map介绍和使用 map是一种无序的基于key-value的数据结构&#xff0c;Go语言的map是引用类型&#xff0c;必须初始化才可以使用。 1. 定义 Go语言中&#xff0c;map类型语法如下&#xff1a; map[KeyType]ValueType KeyType表示键类型ValueType表示值类型 map类型的变量默认…