Golang 模板(text/template) (一)
目录
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}},这里就不再上代码了。
四、总结
从上面的例子中,知道如何使用模板,可以定义简单的模板,并且模板中对输入数据的取值通过“.”,如果是嵌套的结构,还是使用“.”作更进一层的操作。
这一篇就先写到这里,下一篇将更深入的讲解。
文章来源: blog.csdn.net,作者:Linux猿,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/nyist_zxp/article/details/109019595
- 点赞
- 收藏
- 关注作者
评论(0)