Golang 模板(text/template) (一)

  目录

一、基本概念

二、使用步骤

三、简单模板

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}},这里就不再上代码了。

四、总结

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

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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Linux猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值