go模板引擎

Go语言内置了 text/templatehtml/template 两个模板库,专门用于处理网页html模板。
html/template 是在 text/template 模板库的基础上增加了对html输出的安全处理,主要目的是为了防止被攻击。

下面通过一个例子介绍template的用法。

模版引擎使用流程:

  1. 编写模版代码
  2. 导入包
  3. 加载模版代码
  4. 根据模版参数渲染模版

1. 快速入门

1.1 编写模版代码

将下面模版代码保存至 views/demo.tpl 文件中, 文件后缀名随意。

{
  
  {define "demo"}}
昵称: {
  
  {.Name}},
{
  
  {- if .IsWin}}
恭喜,大吉大利,今晚吃鸡!
{
  
  {- else}}
遗憾,鸡被吃光了!
{
  
  {- end}}
{
  
  {- end}}

define “模板名” 用于定义子模板

1.2 导入包

import "text/template"

提示: 这里主要以 text/template 为例,如果要使用 html/template 直接替换包名就行,他们接口一样。

1.3 加载模板代码

加载模版代码,并且创建 template 对象 t

template.ParseGlob 函数加载views目录下的所有tpl为后缀的模版文件

template.Must 函数主要用于检测加载的模版有没有错误,有错误输出panic错误,并且结束程序。

t := template.Must(template.ParseGlob("./views/*.tpl"))

1.4 根据模版参数渲染模版

定义模版参数:

// 这里定义一个struct类型的模版参数,实际上模版可以是任意类型数据
type GameStatus struct {
   
   
    Name string
    IsWin bool
}

提示: 因为只能传入一个模版参数,如果想传入多个模版参数,可以使用map或者struct类型。

初始化模板参数, 这里初始化一个参数数组,下面用于循环渲染模板。

var userStatus = []GameStatus{
   
   
    {
   
   "大春", true},
    {
   
   "NiuBee", false},
    {
   
   "球球", true},
}

下面是根据userStatus 数组循环渲染模板

for _, u := range userStatus {
   
   
    // 根据参数u, 渲染命名为demo的模板,并且将渲染结果打印到标准输出
    err := t.ExecuteTemplate(os.Stdout, "demo", u)
    if err != nil {
   
   
        log.Println("executing template:", err)
    }
}

输出结果:

昵称: 大春,
恭喜,大吉大利,今晚吃鸡!
昵称: NiuBee,
遗憾,鸡被吃光了!
昵称: 球球,
恭喜,大吉大利,今晚吃鸡!

说明:根据不同的模版参数,渲染模版输出不同的页面内容,就是模版引擎的主要工作,目的是简化html模版输出工作。

2. template模版语法

模板表达式都包括在 { { }} 之间。

格式: { { 模板表达式 }}

注释格式: { { /* 注释语法 */ }}

2.1 删除空格处理

删除表达式结果左右两边空格的语法:

  • 在左边增加减号空格,表示删除左边空格: { {- 模板表达式 }}
  • 在右边增加空格减号,表示删除右边空格: { { 模板表达式 -}}
  • 删除表达式左右两边空格的写法: { {- 模板表达式 -}}

2.2 模版参数

在模版中主要通过 点( . ) 引用模版参数。
因为在渲染模版的时候只能传入一个参数,所以点( . ) 正好可以代表模版参数的引用。

模版参数支持数字、布尔值、字符串、map、struct、数组类型。

2.2.1 int/bool/string 类型参数
//渲染demo模版,传入字符串参数 "欢迎访问tizi365.com"
t.ExecuteTemplate(os.Stdout, "demo", "欢迎访问tizi365.com")

模版参数为int/bool/string类型,可以直接用点( . ) 引用即可 :

{
   
   {
   
   .}}

输出:

欢迎访问**tizi365**.com
2.2.2 map/struct 类型参数

如果要传入多个模版参数,一般都使用 map 或者 struct 类型。
引用语法格式:

{
  
  {.字段名}}

嵌套的struct或者map类型引用语法格式:

{
  
  {.字段名1.字段名2}}

使用 点( . ) 连接多个字段名,就可以访问多层嵌套的struct/map类型数据.

//定义struct模版参数
type User struct {
   
   
	Name  string 
}

type Order struct {
   
   
    Id     int
	Title  string
	Customer User  //嵌套字段
}

//初始化模版参数
food := Order{
   
   
    Id:  10,
    Title: "柠檬",
    Customer: User
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值