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 常用方法详解 及 注意事项的更多相关文章

  1. $.ajax()常用方法详解(推荐)

    AJAX 是一种与服务器交换数据的技术,可以在补充在整个页面的情况下更新网页的一部分.接下来通过本文给大家介绍ajax一些常用方法,大家有需要可以一起学习. 1.url: 要求为String类型的参数 ...

  2. 【Java】HashMap源码分析——常用方法详解

    上一篇介绍了HashMap的基本概念,这一篇着重介绍HasHMap中的一些常用方法:put()get()**resize()** 首先介绍resize()这个方法,在我看来这是HashMap中一个非常 ...

  3. phpExcel常用方法详解【附有php导出excel加超级链接】

    phpExcel常用方法详解[附有php导出excel加超级链接] 发表于4年前(-- :) 阅读() | 评论() 0人收藏此文章, 我要收藏 赞0 http://www.codeplex.com/ ...

  4. ListView嵌套GridView使用详解及注意事项

    ListView嵌套GridView即ListView的每个Item中都包含一个GridView:需要注意的是由于ListView和GridView都是可滑动的控件. 所以需要自定义GridView, ...

  5. JavaScript语法基础:数组的常用方法详解

    本文最初发表于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文. 数组的定义 之前学习的数据类型,只能存储一个值(字符串为一个值).如果我 ...

  6. StringUtils工具类常用方法详解

    StringUtils 常用方法 1.isEmpty(String str) 是否为空,空格字符为false2.isNotEmpty(String str) 是否为非空,空格字符为true3.isBl ...

  7. Go标准库:Go template用法详解

    本文只介绍template的语法和用法,关于template包的函数.方法.template的结构和原理,见:深入剖析Go template. 入门示例 以下为test.html文件的内容,里面使用了 ...

  8. Java-Method类常用方法详解

    一.Method类的定义Method类位于 java.lang.reflect 包中,主要用于在程序运行状态中,动态地获取方法信息二.Method类的常用方法  1.getAnnotatedRetur ...

  9. 【python基础】os.path模块常用方法详解

    os.path模块 主要用于文件的属性获取,在编程中经常用到,以下是该模块的几种常用方法. 更多的方法可以去查看官方文档:http://docs.python.org/library/os.path. ...

随机推荐

  1. IBatis分页显示

    <select id="pagedListOrderOpen"> SELECT * FROM ( </select> <sql id="pa ...

  2. spring boot properties

    [转载] 代码从开发到测试要经过各种环境,开发环境,测试环境,demo环境,线上环境,各种环境的配置都不一样,同时要方便各种角色如运维,接口测试, 功能测试,全链路测试的配置,hardcode 肯定不 ...

  3. netcat命令

    1 简介 netcat是网络工具中的瑞士军刀,它能通过TCP和UDP在网络中读写数据.通过与其他工具结合和重定向,你可以在脚本中以多种方式使用它.使用netcat命令所能完成的事情令人惊讶. netc ...

  4. C++学习之Pair

    C++学习之Pair Pair类型概述 pair是一种模板类型,其中包含两个数据值,两个数据的类型可以不同,基本的定义如下: pair<int, string> a; 表示a中有两个类型, ...

  5. macbook pro的usb串口失效的的处理方法

    macbook pro的usb串口失效的的处理方法 2011-08-24 12:14:32|  分类: mac|举报|字号 订阅     今天开电脑,无端端一个usb的串口失效了,接入鼠标 iphon ...

  6. Linux笔记-常用的命令(15-3-30)

    vim命令参考: http://www.cnblogs.com/softwaretesting/archive/2011/07/12/2104435.html [1]解压文件格式的区别: *.tar  ...

  7. Why is applicationhost.config still being added to source control even thought it's in gitignore

      Why is applicationhost.config still being added to source control even thought it's in gitignore g ...

  8. 不下载SDK启动Android Studio

    一.不下载SDK启动Android Studio 给一个解决方法:Android Studio安装目录下的bin,idea.properties:idea.properties文件末尾加一行:disa ...

  9. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+pat----------<base>元素有关

    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request. ...

  10. C语言getopt()函数的使用

    getopt(分析命令行参数)     相关函数表头文件         #include<unistd.h>定义函数         int getopt(int argc,char * ...