通过以下文章,掌握了 Go 模板引擎 的基本用法:

但在开始学习 Beego 框架的 模板嵌套 模块源码时,有点似懂非懂的感觉。认真研究了一段时间,总算搞懂了 其本质的原理:

1、Beego 底层用的是 Go 自带的模板引擎,因此,只需要继续研究 Go 自带的 模板嵌套 的使用方法即可;

2、主要涉及到 4 个模板方法:New()、Parse()、Lookup()、Execute(),先看几个例子:

示例1:

  1. tpl, _ := template.New("mod1").Parse(`我是mod1`)
  2. tpl, _ = tpl.New("mod2").Parse(`我是mod2`)
  3. tpl, _ = tpl.New("mod3").Parse(`我是mod3`)
  4.  
  5. tpl.Execute(os.Stdout, nil)
  6. fmt.Println("\n++++++++++++++++")
  7. fmt.Println(tpl.Name())

输出:

  1. 我是mod3
  2. ++++++++++++++++
  3. mod3

示例2:

  1. tpl, _ := template.New("mod1").Parse(`我是mod1`)
  2. tpl, _ = tpl.New("mod2").Parse(`我是mod2`)
  3. tpl, _ = tpl.New("mod3").Parse(`我是mod3`)
  4.  
  5. tpl2 := tpl.Lookup("mod2")
  6.  
  7. if tpl2 != nil {
  8. tpl2.Execute(os.Stdout, nil)
  9. }

输出:

  1. 我是mod2

示例3:

  1. tpl, _ := template.New("mod1").Parse(`我是mod1`)
  2. tpl, _ = tpl.New("mod2").Parse(`{{define "Title"}}我是mod2_标题{{end}}我是mod2_内容`)
  3. tpl, _ = tpl.New("mod3").Parse(`我是mod3`)
  4.  
  5. tpl2 := tpl.Lookup("mod2")
  6.  
  7. if tpl2 != nil {
  8. tpl2.Execute(os.Stdout, nil)
  9. }

输出:

  1. 我是mod2_内容

示例4:

  1. tpl, _ := template.New("mod1").Parse(`我是mod1`)
  2. tpl, _ = tpl.New("mod2").Parse(`{{define "Title"}}我是mod2_标题{{end}}我是mod2_内容`)
  3. tpl, _ = tpl.New("mod3").Parse(`我是mod3`)
  4.  
  5. tpl2 := tpl.Lookup("Title")
  6.  
  7. if tpl2 != nil {
  8. tpl2.Execute(os.Stdout, nil)
  9. }

输出:

  1. 我是mod2_标题

示例5:

  1. tpl, _ := template.New("mod1").Parse(`我是mod1`)
  2. tpl, _ = tpl.New("mod2").Parse(`{{define "Title"}}我是mod2_标题{{end}}我是mod2_内容`)
  3. tpl, _ = tpl.New("mod3").Parse(`我是mod3`)
  4. tpl = tpl.New("mod4")
  5. tpl, _ = tpl.New("mod5").Parse("我是mod5")
  6.  
  7. fmt.Println(tpl.Name())
  8. fmt.Println("+++++++++++++++")
  9.  
  10. tpl2 := tpl.Lookup("mod4")
  11. if tpl2 != nil {
  12. tpl2.Execute(os.Stdout, nil)
  13. }
  14.  
  15. tpl3 := tpl.Lookup("mod5")
  16. if tpl3 != nil {
  17. tpl3.Execute(os.Stdout, nil)
  18. }

输出:

  1. mod5
  2. +++++++++++++++
  3. 我是mod5

示例6:

  1. tpl, _ := template.New("mod1").Parse(`我是mod1`)
  2. tpl, _ = tpl.New("mod2").Parse(`{{define "Title"}}我是mod2_标题{{end}}我是mod2_内容`)
  3.  
  4. tpl, _ = tpl.New("mod1").Parse(`我是mod1_内容{{define "Title"}}我是mod1_标题{{end}}`)
  5.  
  6. fmt.Println(tpl.Name())
  7. fmt.Println("+++++++++++++++")
  8.  
  9. tpl2 := tpl.Lookup("mod1")
  10. if tpl2 != nil {
  11. tpl2.Execute(os.Stdout, nil)
  12. }
  13.  
  14. fmt.Println("\n+++++++++++++++")
  15.  
  16. tpl3 := tpl.Lookup("Title")
  17. if tpl3 != nil {
  18. tpl3.Execute(os.Stdout, nil)
  19. }

输出:

  1. mod1
  2. +++++++++++++++
  3. 我是mod1_内容
  4. +++++++++++++++
  5. 我是mod1_标题

示例7:

  1. tpl, _ := template.New("mod1").Parse(`我是mod1`)
  2. tpl, _ = tpl.New("mod2").Parse(`{{define "Title"}}我是mod2_标题{{end}}我是mod2_内容`)
  3. tpl, _ = tpl.New("mod3").Parse(`我是mod3_{{template "mod1"}}_{{template "Title"}}`)
  4.  
  5. tpl2 := tpl.Lookup("mod3")
  6.  
  7. if tpl2 != nil {
  8. tpl2.Execute(os.Stdout, nil)
  9. }

输出:

  1. 我是mod3_我是mod1_我是mod2_标题

总结:

1、一个模板对象,可以有多个“名称”,但是通过 .Name() 方法,只返回最后一次通过 .New() 方法新建的“名称”。特别注意:此时的 模板对象 的 数据段也是指向该“名称”所绑定的“字符串”数据;

2、一个模板对象,可以有多个“名称”,但是他们是相互独立的,每个“名称”,通过 .Parse() 方法,可以与一段“字符串”数据对象建立关联。也就是说,后期通过 .Lookup("某个名称") 方法获取到的(模板)对象,其当前数据段,指向该“字符串”,再通过 .Execute() 方法输出的内容,也是跟该“字符串”相关的内容;

3、在某个“名称”的数据“字符串”对象中,可以用 define 定义子模块名,如 {{define "子模块名"}}子模块内容{{end}},该 “子模块”又独立于 当前“名称”,即 当前“名称”的输出内容,不包含 “子模板”的内容,参考 示例3

只输出“我是mod2_内容”,并没有输出“我是mod2_标题”

4、特别注意,通过 {{define "子模块名"}}子模块内容{{end}} 定义的名称,并不是 模板对象 的一个“名称”,但是我们同样可以用  .Lookup("某个名称") 方法获取到对象,其当前数据段,指向该 “子模块”,再通过 .Execute() 方法输出的内容,也是跟该“子模块”相关的内容,查看 示例4

只输出“我是mod2_标题”

5、可用重复定义“名称”和 “子模块”,但后面定义的会覆盖前面定义的,即 只有最后一次定义的有效。参考 示例6

6、模板内容(“名称”的“字符串”对象)中,可通过 template 关键字来 引用/包含 “名称”和 “子模块”,如 {{template "名称/子模块"}},参考 示例7

搞明白了这些基础知识,再回过头看 Beego 的模板模块,已是非常简单了!

[Go] Beego 模板嵌套 使用总结的更多相关文章

  1. beego——模板语法

    一.基本语法 go统一使用{{和}}作为左右标签,没有其它的标签符号. 使用"."来访问当前位置的上下文,使用"$"来引用当前模板根级的上下文,使用$var来访 ...

  2. Beego模板 循环和判断几个例子

    Beego模板 循环和判断几个例子 Beego的前端几乎是另一种语言.一些循环.判断,不细看文档真的做不出来. 0. Beego的View模板语法规则: beego前端(view)统一使用了 {{ 和 ...

  3. beego——模板函数

    beego 支持用户定义模板函数,但是必须在 beego.Run() 调用之前,设置如下: func hello(in string)(out string){ out = in + "wo ...

  4. beego——模板处理

    beego的模板处理引擎采用的是Go内置的html/template包进行处理,而且beego的模板处理逻辑是采用了缓存编译方式, 也就是所有的模板会在beego应用启动的时候全部编译然后缓存在map ...

  5. (55)zabbix模板嵌套

    在zabbix使用过程中,在某些情况下,一个host需要link多个模板.这么做显得比较麻烦,很容易忘记到底要link哪些模板,我想link一个模板就达成这个目标,行不行?然没问题,zabbix模板内 ...

  6. django - Templates模板嵌套语法

    模板继承 1.继承母板:{% extends '母板html文件名称' %} 2.包含子模板:{% include  '子母板html 文件名' %} 模板内容分块 {% block <分块名& ...

  7. Go 收藏

    Golang 定位解决分布式系统,服务器应用开发,主要竞争对手是 Java.Python 之类:Rust 定位解决单机安全问题,高性能场景偏系统底层开发,主要竞争对手就是 C 和 C++. Golan ...

  8. beego——view 模板语法

    一.基本语法 go统一使用{{和}}作为左右标签,没有其它的标签符号. 使用"."来访问当前位置的上下文,使用"$"来引用当前模板根级的上下文,使用$var来访 ...

  9. 1kb的前端HTML模板解析引擎,不限于嵌套、循环、函数你能想到的解析方式

    传送门:https://github.com/xiangyuecn/BuildHTML copy之前说点什么 html做点小功能(什么都没有),如果是要手动生成html这种操作,容易把代码搞得乱七八糟 ...

随机推荐

  1. A*算法改进——Any-Angle Path Planning的Theta*算法与Lazy Theta*算法

    本文是该篇文章的归纳http://aigamedev.com/open/tutorial/lazy-theta-star/#Nash:07 . 传统的A*算法中,寻找出来的路径只能是沿着给出的模型(比 ...

  2. django+mysql安装和设置

    之前我们已经用sqlite建立了第一个web app.今天来学习如何在django中使用MySQL. 首先需要安装MySQL,到官网下载安装包:https://dev.mysql.com/downlo ...

  3. Nginx是什么,有什么优点?为什么选择Nginx做web服务器软件?(经典经典)

    1.基础知识 代理服务器:    一般是指局域网内部的机器通过代理服务器发送请求到互联网上的服务器,代理服务器一般作用在客户端.应用比如:GoAgent,FQ神器.    一个完整的代理请求过程为:客 ...

  4. 常用 Git 命令清单【转】

    转自:http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html 作者: 阮一峰 日期: 2015年12月 9日 我每天使用 Git ,但是 ...

  5. innobackupex不停库的数据备份并恢复到别的服务器上【转】

    1.innobackupex原理: 备份原理 1).首先会开启一个后台检测进程,实时检测myql redo的变化,一旦发现redo中有新日志写入,立即将日志记入后台日志文件xtrabackup_log ...

  6. 大数据的常用算法(分类、回归分析、聚类、关联规则、神经网络方法、web数据挖掘)

    在大数据时代,数据挖掘是最关键的工作.大数据的挖掘是从海量.不完全的.有噪声的.模糊的.随机的大型数据库中发现隐含在其中有价值的.潜在有用的信息和知识的过程,也是一种决策支持过程.其主要基于人工智能, ...

  7. Ibatis.Net 动态SQL语句学习(六)

    在学习动态SQL语句之前,首先必须对条件查询有一定了解,先来学习如何向IBatis.Net的映射文件里传入参数吧. 一.条件查询 1.传递单个参数 如根据Id查询: <select id=&qu ...

  8. spark优化之临时目录

    官方是这样说的: Directory to use for "scratch" space in Spark, including map output files and RDD ...

  9. HttpRequest中常见的四种Content-Type(转)

    add by zhj: Content-Type用于说明request body的编码格式的,对于没有request body的http method如GET,HEAD没有必要设置这个参数,当然,你设 ...

  10. Angular 个人深究(一)【Angular中的Typescript 装饰器】

    Angular 个人深究[Angular中的Typescript 装饰器] 最近进入一个新的前端项目,为了能够更好地了解Angular框架,想到要研究底层代码. 注:本人前端小白一枚,文章旨在记录自己 ...