zoukankan      html  css  js  c++  java
  • go template包使用注意事项

    Go template包下面有两个函数可以创建模板示例

    func New(name string) *Template
    func ParseFiles(filenames ...string) (*Template, error)
    首先要说的是每一个template内部可以存储多个模板 而且每个模板必须对应一个独立的名字

    两个的不同点在于
    使用New在创建时就为其添加一个模板名称 并且执行t.Execute()会默认去寻找该名称进行数据融合

    使用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允许在模板中自定义变量
    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, // !=
    }

    原文:https://blog.csdn.net/u012807459/article/details/31531367

  • 相关阅读:
    HBase之表状态
    HBase之show table
    HBase之表空间
    HBase之创建表
    php 正则截取文章图片
    容器,表格 ,div,元素可左右拖动,滚动 css
    php 爬虫简单示例
    Typecho 调用分类文章列表
    Typecho 独立页面 添加自定义模板
    php 类与对象 面向对象编程 简单例子
  • 原文地址:https://www.cnblogs.com/laogao123/p/11075777.html
Copyright © 2011-2022 走看看