golang

来源:互联网 发布:风冷知乎 编辑:程序博客网 时间:2024/05/16 07:25

text/template

template直接方法

  • func ParseFiles(filenames ...string) (*Template, error) -> 用于创建一个模板并解析filenames指定的文件里面的模板定义。返回的模板的名字是第一个文件的文件名(不含扩展名),内容为解析后的第一个文件的内容。如果发生错误,会停止解析并返回nil。
  • func New(name string) *Template -> 用于创建一个名为name的模板
  • func ParseGlob(pattern string) (*Template, error) -> 创建一个模板并解析匹配pattern的文件(参见glob规则)里的模板定义。返回的模板的名字是第一个匹配的文件名(不含扩展名),内容为解析后的第一个文件的内容。至少条存在一个匹配的文件,如果发生错误,将会停止解析并返回nil。ParseGlob等价于使用匹配pattern的文件的列表为参数调用ParseFiles.
  • func Must(t *Template, err error) *Template -> Must函数用于包装返回(*Template,error)的函数/方法调用,它会在err非nil时panic,一般用于变量初始化
var t = template.Must(template.New("name")).Parse("text")

struct

  • type Template
type Template struct{    *parse.Tree    // 内含隐藏或非导出字段 }// 方法func (t *Template) Parse(text string) (*Template, error) //将字符串text解析成模板,嵌套定义的模板会关联到最顶层的t。Parse可以多次调用,但只有第一次调用可以包含空格、注释和模板定义之外的文本。如果后面的调用在解析后仍剩余文本会引发错误,返回nil且丢弃剩余文本;如果解析得到的模板已有相关联的同名模板,会覆盖掉原模板func (t *Template) Name() string  // 返回模板t的名字func (t *Template) Delims(left, right string) *Template  // Delims方法用于设置action的分界字符串,应用于之后的Parse、ParseFiles、ParseGlob方法。嵌套模板定义会继承这种分界符设置。空字符串分界符表示相应的默认分界符:{{或}}。返回值就是t,以便进行链式调用。func (t *Template) Execute(wr io.Writer, data interface{}) (err error) // Execute方法将解析好的模板应用到data上,并将输出写入wr,如果执行时出现错误,会停止执行,但有可能已经写入wr部分数据。模板可以安全并发执行。func (t *Template) ExecuteTemplate(wr io.Writer, name string, data interface{}) error  // 类似Execute,但是使用名为name的t关联的模板产生输出

通过将模板应用于一个数据结构(即该数据结构作为模板的参数)来执行,来获得输出。模板中的注释引用数据接口的元素(一般如结构体的字段或字典的键)来控制执行过程和获得需要呈现的值。模板执行时会遍历结构并将指针表示为.(称之为dot)指向运行过程中数据结构的当前位置的值

Action(动作)表。

  1. {{/* a comment */}} 注释,可以多行,不能嵌套,而且必须紧贴分界符始止。
  2. {{pipeline}} pipeline的值的默认文本会被拷贝到输出里面
  3. {{if pipeline}} T1 {{end}} if语句。不改变dot的值
  4. {{if pipeline}} T1 {{else}} T0 {{end}} if else语句,不改变dot的值
  5. {{if pipeline}} T1 {{else if pipeline}} T0 {{end}}用于简化if-else的链条,else action可以直接直接包含另一个if
  6. {{range pipeline}} T1 {{end}} pipeline的值必须是数组/切片/map/channel。如果pipeline的长度为0,不会有任何输出,否则dot依次设为数组/切片/字典/通道的每一个成员元素并执行T1.如果pipeline的值为map,且键可排序的基本类型,元素也会按键的顺序排序
  7. {{range pipeline}} T1 {{else}} T0 {{end}} pipeline的值必须是数组/切片/map/channel。如果pipeline的值长度为0,不改变dot的值并执行T0,否则会修改dot并执行T1。
  8. {{template "name"}} 执行名为name的模板,提供给模板的参数为nil,如模板不存在则输出为”“
  9. {{with pipeline}} T1 {{end}} 如果pipeline为空,不产生输出,否则将dot设为pipeline的值并执行T1。不修改外面的dot。
  10. {{with pipeline}} T1 {{else}} T0 {{end}}如果pipeline为空,不改变dot并执行T0,否则dot设为pipeline的值并执行T1。

Arguments(参数)表

  1. go语法的布尔值、字符串、字符、整数、浮点数、虚数、复数,视为无类型字面常数,字符串不能跨行
  2. 关键字nil,代表一个go的无类型的nil值
  3. 字符’.’(句点,用时不加单引号),代表dot的值
  4. 变量名,以美元符号起始加上(可为空的)字母和数字构成的字符串,如:$piOver2和$
  5. 执行结果为变量的值,变量参见下面的介绍
  6. 结构体数据的字段名,以句点起始,如:.Field; 执行结果为字段的值,支持链式调用:.Field1.Field2;字段也可以在变量上使用(包括链式调用):$x.Field1.Field2;
  7. 字典类型数据的键名;以句点起始,如:.Key;执行结果是该键在字典中对应的成员元素的值;键也可以和字段配合做链式调用,深度不限:.Field1.Key1.Field2.Key2;虽然键也必须是字母和数字构成的标识字符串,但不需要以大写字母起始;键也可以用于变量(包括链式调用):$x.key1.key2;
  8. 数据的无参数方法名,以句点为起始,如:.Method;执行结果为dot调用该方法的返回值,dot.Method();该方法必须有1到2个返回值,如果有2个则后一个必须是error接口类型;如果有2个返回值的方法返回的error非nil,模板执行会中断并返回给调用模板执行者该错误;方法可和字段、键配合做链式调用,深度不限:.Field1.Key1.Method1.Field2.Key2.Method2;方法也可以在变量上使用(包括链式调用):$x.Method1.Field;
  9. 无参数的函数名,如:fun;执行结果是调用该函数的返回值fun();对返回值的要求和方法一样;函数和函数名细节参见后面。
  10. 上面某一条的实例加上括弧(用于分组)执行结果可以访问其字段或者键对应的值:
 print (.F1 arg1) (.F2 arg2)(.StructValuedMethod "arg").Field

Arguments可以是任何类型:如果是指针,有必要时会自动表示 为指向指向的值;如果执行结果生成了一个函数类型的值,如结构体的函数类型字段,该函数不会自动调用,但可以在if等action中视为真。如果要调用,可以使用call函数。

Argument    执行结果是arguement的执行结果.Method [Argument...]    方法可以独立调用或者位于链式调用的末端functionName [Argument...]    执行结果是返回值

Pipelines

pipeline是一个command序列,Command可以是一个简单值(argument)或者对函数或者方法的(可以有多个参数的)调用

Variables

Action里可以初始化一个变量来捕获管道的执行结果。

例子

下面是一些单行模板,展示了pipeline和变量,所有都生成带引号的单词”output”:

{{"\"output\""}}  // 字符串常量{{`"output"`}}  // 原始字符串常量{{printf "%q" "output"}}  //函数调用{{"output" | printf "%q"}}  // 函数调用,最后一个参数来自前一个command的返回值{{printf "%q" (print "out" "put")}}  // 加括号的参数{{"put" | printf "%s%s" "out" | printf "%q"}}  // 玩出花的管道的链式调用{{"output" | printf "%s" | printf "%q"}}  // 管道的链式调用{{with "output"}} {{printf "%q"}} {{end}}  // 使用dot的with action{{with $x:="output" | printf "%q" $x}}{{end}}  // 将变量使用在另一个action的with action{{with $x := "output"}}{{$x | printf "%q"}}{{end}}  //以管道形式将变量使用在另一个action的with action
原创粉丝点击