Golang 模板(text/template) (一)详解

举报
Linux猿 发表于 2021/12/14 23:07:13 2021/12/14
【摘要】 CSDN博客专家🏆,华为云享专家🏆,数据结构和算法、C/C++、面试、刷题、Linux尽管咨询我,关注我,有问题私聊! 欢迎小伙伴们点赞👍、收藏⭐、留言💬

🎈 作者:Linux猿

🎈 简介:CSDN博客专家🏆,华为云享专家🏆,数据结构和算法、C/C++、面试、刷题、Linux尽管咨询我,关注我,有问题私聊!

🎈 关注专栏: 动图讲解数据结构和算法 (优质好文持续更新中……)🚀

🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬


目录

一、基本概念

二、使用步骤

三、简单模板

3.1 传递单个变量

3.2 传递结构体

四、总结


Golang 模板提供了将一个变量值填充到一个文本或HTML模板中的机制,有两种提供模板功能的包,分别是:text/template 和 html/template,两个软件包具有相同的接口,主要区别是html/template为了防止注入攻击,将一些字符进行了转义。

这篇文章主要以 text/template 为例进行讲解,本篇主要介绍模板基本概念和使用步骤,更多的模板技巧和复杂操作将在Golang 模板(text/template)(二)中进行介绍。

一、基本概念

先简单理解模板中使用到的几个概念,后面会通过实例进行讲解:

Actions : 数据评估和控制结构,有“{{” 和 “}}” 包裹起来;

Text : 模板中可以原样输出的文本;

Arguments : 值,可以是布尔值、整数、函数等;

Pipelines : 命令的链式序列;

二、使用步骤

(1)定义模板

根据需要定义自己的模板,使用字符串的形式表示,例如:

strTemplate := "I like {{.}}!\n" 

其中,{{.}} 就是一个Actions。

(2)解析模板

定义模板名称,对模板进行解析,例如:

templ, err := template.New("templateName").Parse(strTemplate)

其中,templateName为模板名。

(3)数据驱动模板

将数据与解析后模板结合,产生输出,例如:

err = templ.Execute(os.Stdout, variable) 

三、简单模板

3.1 传递单个变量

先介绍下传递单个变量值的简单模板,没有复杂的结构,便于快速理解。

import (
	"os"
	"text/template"
)

func main() {
	name := "cats"                                               // 填充内容-可变
	strTemplate := "I like {{.}}!\n"                             // (1)定义模板-固定不变
	templ, err := template.New("templateName").Parse(strTemplate) // (2)解析模板
	if err != nil {
		panic(err)
	}
	err = templ.Execute(os.Stdout, name) //(3)数据驱动模板,将name的值填充到模板中
	if err != nil {
		panic(err)
	}
}

输出为:

I like cats!

变量name在第(3)步数据驱动模板的时候会替换掉模板中的 {{.}},注意导入的标准库是 text/template 还是 html/template。当然,你可以修改name的值,就可以输出不同的结果。

从上面的列子可以看出,{{.}} 用来代指模板中将要替换的元素,其中“.”指向当前元素,和Linux中的目录有异曲同工之妙,上面的理解后,再来看一个复杂点的。

3.2 传递结构体

有的时候传递单个变量满足不了需求,需要传递结构体,下面通过一个例子来看下。

import (
	"os"
	"text/template"
)

type student struct {
	Name string
	Like string
}

func main() {

	Joy := student{"Joy", "Ping pang"}
	strTemplate := "My name is  {{.Name}} and I like to play {{.Like}}!\n" // (1)定义模板-固定不变
	templ, err := template.New("templateOne").Parse(strTemplate)           // (2)解析模板
	if err != nil {
		panic(err)
	}
	err = templ.Execute(os.Stdout, Joy) //(3)数据驱动模板,将name的值填充到模板中
	if err != nil {
		panic(err)
	}
}

输出为:

My name is  Joy and I like to play Ping pang!

在模板中使用.Name 或 .Like等变量名来获取结构体内的变量,当在第(3)步数据驱动模板传入对应结构体的时候会将对应的值填充到模板对应位置。当然,如果结构体内的变量也是一个结构体,可以使用 “.” 作更进一步引用,例如:假设上面结构体中Like也是一个结构体,包含变量Num,可以这样引用:{{.Like.Num}},这里就不再上代码了。

四、总结

从上面的例子中,知道如何使用模板,可以定义简单的模板,并且模板中对输入数据的取值通过“.”,如果是嵌套的结构,还是使用“.”作更进一层的操作。

这一篇就先写到这里,下一篇将更深入的讲解。


CSDN博客专家🏆,华为云享专家🏆,数据结构和算法、C/C++、面试、刷题、Linux尽管咨询我,关注我,有问题私聊!

欢迎小伙伴们点赞👍、收藏⭐、留言💬


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。