Go - template 常用方法详解 及 注意事项
Go template包下面有两个函数可以创建模板实例
func New(name string) *Template
func ParseFiles(filenames ...string) (*Template, error)
首先要说的是每一个template内部可以存储多个模板,而且每个模板必须对应一个独立的名字。
两个的不同点在于:
1、使用 New() 在创建时就为其添加一个模板名称,并且执行 t.Execute() 会默认去寻找该名称进行数据融合;
2、使用 ParseFiles() 创建模板可以一次指定多个文件加载多个模板进来,但是就不可以使用 t.Execute() 来执行数据融合;
因为使用 t.Execute() 无法找到要使用哪个加载过的模板进行数据融合,而只有New()创建时才会指定一个 t.Execute() 执行时默认加载的模板。
但是 ParseFiles() 可以通过
func (t *Template) ExecuteTemplate(wr io.Writer, name string, data interface{}) error
来进行数据融合,因为该函数可以指定模板名,因此,实例模板就可以知道要去加载自己内部的哪一个模板进行数据融合。
当然无论使用 New() 还是 ParseFiles() 创建模板,都是可以使用 ExecuteTemplate() 来进行数据融合,
但是对于 Execute() 一般与 New() 创建的模板进行配合使用。
html/template 和 text/template
html下的template结构体 实际上是继承了 text 下面的 template结构体
template包下面还有一个 ParseGlob() 方法用于批量解析文件比如在当前目录下有以h开头的模板10个,
使用 template.ParseGlob("h*") 即可页将10个模板文件一起解析出来。
注意事项
下面这段代码的输出一定为空
t := template.New("haha")
t, err := t.ParseFiles("header.tmpl")
fmt.Println(err)
t.Execute(os.Stdout, nil)
原因是为什么呢.....
首先先记住一个原则 template.New() 和 ParseFiles() 最好不要一起使用,
如果非要一起使用,那么要记住,
New("TName") 中的 TName 必须要和 header.tmpl 中定义的{{define name}}中的 name 同名。
但是正常的做法应该是这样的,同样的 ExecuteTemplate() 中输入的 name 也必须和模板中 {{define name}} 相同。
t, _ := template.ParseFiles("header.tmpl")
t.ExecuteTemplate(os.Stdout, "header", nil)
这里要注意下,在这种情况下如果使用 t.Execute() 也是不会输出任何结果的,因为他并不知道你要使用哪个模板。
另外一点要注意的就是
如果模板中没有与填充数据对应的模板语言,那么很有可能panic。
模板中 {{}} 花括号表达式,自动实现了对js代码的过滤,如何不过滤js代码呢,只需要使用 text/template 包下的template,因为html/template包下的模板实现一些针对html的安全操作包括过滤js代码。
Golang 当中支持 Pipeline,一样是使用 |,
Go允许在模板中自定义变量,自定义模板函数。
函数定义必须遵循如下格式:
func FuncName(args ...interface{}) string
通过 template.FuncMap() 强制类型转换为 FuncMap 类型,然后再通过 template实例的 Func(FuncMap) 添加在模板实例中,这样该模板内部在解析时就可以使用该函数。
Go模板包中自定义了一系列内置函数:
var builtins = FuncMap{
"and": and,
"call": call,
"html": HTMLEscaper,
"index": index,
"js": JSEscaper,
"len": length,
"not": not,
"or": or,
"print": fmt.Sprint,
"printf": fmt.Sprintf,
"println": fmt.Sprintln,
"urlquery": URLQueryEscaper,
// Comparisons
"eq": eq, // ==
"ge": ge, // >=
"gt": gt, // >
"le": le, // <=
"lt": lt, // <
"ne": ne, // !=
}
摘自:
http://blog.csdn.net/u012807459/article/details/31531367
Go - template 常用方法详解 及 注意事项的更多相关文章
- $.ajax()常用方法详解(推荐)
AJAX 是一种与服务器交换数据的技术,可以在补充在整个页面的情况下更新网页的一部分.接下来通过本文给大家介绍ajax一些常用方法,大家有需要可以一起学习. 1.url: 要求为String类型的参数 ...
- 【Java】HashMap源码分析——常用方法详解
上一篇介绍了HashMap的基本概念,这一篇着重介绍HasHMap中的一些常用方法:put()get()**resize()** 首先介绍resize()这个方法,在我看来这是HashMap中一个非常 ...
- phpExcel常用方法详解【附有php导出excel加超级链接】
phpExcel常用方法详解[附有php导出excel加超级链接] 发表于4年前(-- :) 阅读() | 评论() 0人收藏此文章, 我要收藏 赞0 http://www.codeplex.com/ ...
- ListView嵌套GridView使用详解及注意事项
ListView嵌套GridView即ListView的每个Item中都包含一个GridView:需要注意的是由于ListView和GridView都是可滑动的控件. 所以需要自定义GridView, ...
- JavaScript语法基础:数组的常用方法详解
本文最初发表于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文. 数组的定义 之前学习的数据类型,只能存储一个值(字符串为一个值).如果我 ...
- StringUtils工具类常用方法详解
StringUtils 常用方法 1.isEmpty(String str) 是否为空,空格字符为false2.isNotEmpty(String str) 是否为非空,空格字符为true3.isBl ...
- Go标准库:Go template用法详解
本文只介绍template的语法和用法,关于template包的函数.方法.template的结构和原理,见:深入剖析Go template. 入门示例 以下为test.html文件的内容,里面使用了 ...
- Java-Method类常用方法详解
一.Method类的定义Method类位于 java.lang.reflect 包中,主要用于在程序运行状态中,动态地获取方法信息二.Method类的常用方法 1.getAnnotatedRetur ...
- 【python基础】os.path模块常用方法详解
os.path模块 主要用于文件的属性获取,在编程中经常用到,以下是该模块的几种常用方法. 更多的方法可以去查看官方文档:http://docs.python.org/library/os.path. ...
随机推荐
- SampleDateFormat进行日期格式化
我们生成的日期 ,可能不是我们想要的格式,这时候,就要用到SampleDateFormat类的format方法转换一下, SampleDateFormat是java.text包下的一个常用日期类 这个 ...
- Beta版本冲刺第三天 12.9
一.站立式会议照片: 二.项目燃尽图: Android端 后台 三.项目进展: 成 员 上次完成任务 今天完成任务 明天要做任务 问题困难 心得体会 胡泽善 完成用户简历的填写和查看 日期合理性的判断 ...
- Win10 Theano Install Guide
basic install guide 1. download miniconda 2. conda install libpython mingw 3. conda install theano n ...
- OpenGLES入门笔记一
学习地址:http://www.raywenderlich.com/3664/opengl-tutorial-for-ios-opengl-es-2-0 中文翻译:http://www.cnblogs ...
- JZOJ P1830[9.30]送牛奶
传送门 临近NOIp,写一些简单题. 二分+BFS,注意的是要把数组开小点,有效减少memset的时间. //OJ 1830 //by Cydiater //2016.9.22 #include &l ...
- UVA11178 Morley's Theorem(基础模板)
题目链接 题意:给出A,B, C点坐标求D,E,F坐标,其中每个角都被均等分成三份 求出 ABC的角a, 由 BC 逆时针旋转 a/3 得到BD,然后 求出 ACB 的角a2, 然后 由 BC顺时 ...
- 有return的情况下try catch finally的执行顺序
结论:1.不管有木有出现异常,finally块中代码都会执行:2.当try和catch中有return时,finally仍然会执行:3.finally是在return后面的表达式运算后执行的(此时并没 ...
- Linux学习之CentOS--CentOS6.下Mysql数据库的安装与配置
跟着配置,顺利配置完成 http://www.cnblogs.com/xiaoluo501395377/archive/2013/04/07/3003278.html
- JAVASE 面试总结(1)
1.什么是Java虚拟机?为什么Java被称作是"平台无关的编程语言"?Java虚拟机是一个可以执行Java字节码的虚拟机进程.Java源文件被编译成能被Java虚拟机执行的字节码 ...
- 从Paxos到ZooKeeper-二、ZooKeeper和Paxos
ZooKeeper为分布式应用提供了高效且可靠的分布式协调服务,提供了诸如tong'yi统一命名服务.配置管理和分布式锁等分布式的基础服务.在解决分布式数据一致性方面,ZooKeeper并没有直接采用 ...