当前位置:首页 > Web开发 > 正文

输出: My full name is lee darjun. 关于参数的几个要点: 参数可以是任何类型; 如果参数为指

2024-03-31 Web开发

模板引擎是 Web 编程中必不成少的一个组件。模板能疏散逻辑和数据,使得逻辑简洁清晰,并且模板可复用。引用第二篇文章《措施布局》一文中的图示,我们可以看到模板引擎在 Web 措施布局中的位置:

技术图片

模板引擎凭据成果可以划分为两种类型:

无逻辑模板引擎:此类模板引擎只进行字符串的替换,无其它逻辑;

嵌入逻辑模板引擎:此类模板引擎可以在模板中嵌入逻辑,实现流程控制/循环等。

这两类模板引擎都对照极端。无逻辑模板引擎需要在措置惩罚惩罚器中特别添加很多逻辑用于生成替换的文本。而嵌入逻辑模板引擎则在模板中混入了大量逻辑,导致维护性较差。实用的模板引擎一般介于这两者之间。

在Go 语言中,text/template和html/template两个库实现模板成果。

模板内容可以是 UTF-8 编码的任何内容。此顶用{{和}}包抄的部分称为行动,{{}}外的其它文本在输出连结不乱。模板需要应用到数据,模板中的行动会按照数据生成响应的内容来替换。

模板解析之后可以多次执行,也可以并行执行,但是注意使用同一个Writer会导致输出交替呈现。

模板的内容较多,我将分为两篇文章介绍。本文介绍text/template,包孕 Go 模板的根基观点,用法和注意点。下篇文章介绍html/template。

初体验

使用模板引擎一般有 3 个法式:

界说模板(直接使用字符串字面量或文件);

解析模板(使用text/template或html/template中的要领解析);

传入数据生成输出。

package main import ( "log" "os" "text/template" ) type User struct { Name string Age int } func stringLiteralTemplate() { s := "My name is {{ .Name }}. I am {{ .Age }} years old.\n" t, err := template.New("test").Parse(s) if err != nil { log.Fatal("Parse string literal template error:", err) } u := User{Name: "darjun", Age: 28} err = t.Execute(os.Stdout, u) if err != nil { log.Fatal("Execute string literal template error:", err) } } func fileTemplate() { t, err := template.ParseFiles("test") if err != nil { log.Fatal("Parse file template error:", err) } u := User{Name: "dj", Age: 18} err = t.Execute(os.Stdout, u) if err != nil { log.Fatal("Execute file template error:", err) } } func main() { stringLiteralTemplate() fileTemplate() }

在可执行措施目录中新建模板文件test,并写入下面的内容:

My name is {{ .Name }}. I am {{ .Age }} years old.

首先挪用template.New创建一个模板,参数为模板名。

然后挪用Template类型的Parse要领,解析模板字符串,生成模板主体。这个要领返回两个值。如果模板语法正确,则返回模板东西自己和一个 nil 值。
如果有语法错误,则返回一个 error 类型的值作为第二个返回值,这时不应该使用第一个返回值。

最后,挪用模板东西的Execute要领,传入参数。Execute执行模板中的行动,将功效输出到os.Stdout,即标准输出。最终我们看到模板中{{ .Name }}被u的Name字段替换,{{ .Age }}被u的Age字段替换,标准输出中显示下面一行字符串:

My name is darjun. I am 28 years old.

上面代码中,fileTemplate函数还演示了如何从文件中加载模板。此中template.ParseFiles要领会创建一个模板,并将用户指定的模板文件名用作这个新模板的名字:

t, err := template.ParseFiles("test")

相当于:

t := template.New("test") t, err := t.ParseFiles("test") 行动

Go 模板中的行动就是一些嵌入在模板里面的命令。行动梗概上可以分为以下几种类型:

点行动;

条件行动;

迭代行动;

设置行动;

包罗行动。

点行动

在介绍其它的行动之前,我们先看一个很重要的行动,点行动({{ . }})。它其实代表是通报给模板的数据,其他行动或函数根基上都是对这个数据进行措置惩罚惩罚,以此来到达格局化和内容展示的目的。

对前面的代码示例稍作改削:

func main() { s := "The user is {{ . }}." t, err := template.New("test").Parse(s) if err != nil { log.Fatal("Parse error:", err) } u := User{Name: "darjun", Age: 28} err = t.Execute(os.Stdout, u) if err != nil { log.Fatal("Execute error:", err) } }

运行措施,标准输出显示:

The user is {darjun 28}.

实际上,{{ . }}会被替换为传给给模板的数据的字符串暗示。这个字符串与以数据为参数挪用fmt.Sprint函数得到的内容不异。我们可以为User布局编写一个要领:

func (u User) String() string { return fmt.Sprintf("(name:%s age:%d)", u.Name, u.Age) }

这样替换的字符串就是格局化之后的内容了:

The user is (name:darjun age:28).

注意:为了使用的便利和灵活,在模板中差此外上下文内,.的含义可能会转变,下面在介绍差此外行动时会进行说明。

条件行动

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/31639.html