Golang的Template包:构建强大的网页生成器

介绍

Golang的Template包是一个用于生成文本输出的库。该包可用于生成 HTML 文件,电子邮件文本,代码生成等。模板引擎就是将一个文本文件和一组数据作为输入,生成另外一组文本文件作为输出的一个工具。Template包将模板和数据分离,最终生成一些具有可重复使用的结构的输出,例如HTML或者电子邮件。

创建模板

模板是一个包含零个或多个自定义动作元素的文本字符串。模板本身是一个字符串,通常在磁盘中或从网络中获取。通常情况下,编写 HTML 或 XML 文本文件并在其中插入动态数据,但也可以用于生成其他形式的文本输出或代码生成。

1、创建简单的模板

下面是一个用于打印标题和内容的模板示例:

package main

import (

"os"

"text/template"

)

func main() {

const tpl = `

{{.Title}}

{{.Title}}

{{.Content}}

`

data := struct {

Title string

Content string

}{

Title: "Golang的Template包",

Content: "Golang的 Template包是一个用于生成文本输出的库。",

}

t := template.Must(template.New("tpl").Parse(tpl))

t.Execute(os.Stdout, data)

}

在这个示例中,我们创建了一个名为 tpl 的常量,它包含了要生成的 HTML 的模板。

这个模板包含了两个动态标记:

- title:表示要生成标题的动态标记。

- content:表示网页主体内容的动态标记。

通过额外的结构和填充数据,我们传递标题和内容给这个模板。

注意使用 "." 访问结构字段 - Title 和 Content 和结构相应的字段名称相对应。

2、for 循环和条件语句

Template 语言提供了顺序执行的函数,使您可以在模板执行期间创建必要的逻辑。例如,您可以使用条件或循环来控制动态生成的文本的打印。下面是一个包含循环和条件的模板示例:

package main

import (

"os"

"text/template"

)

type Post struct {

Title string

Body string

Comments []Comment

}

type Comment struct {

Name string

Text string

}

func main() {

const tpl = `

{{.Title}}

{{.Title}}

{{.Body}}

Comments

{{range .Comments}}

{{.Name}}: {{.Text}}

{{else}}

No comments yet

{{end}}

`

post := Post{

Title: "Golang的 Template包",

Body: "Golang的 Template包是一个用于生成文本输出的库。",

Comments: []Comment{

Comment{

Name: "Steve",

Text: "I love Go language",

},

Comment{

Name: "Mike",

Text: "Go language is very interesting",

},

},

}

t := template.Must(template.New("tpl").Parse(tpl))

t.Execute(os.Stdout, post)

}

在这个示例代码中,我们创建了一个 Post 结构,该结构包含文章标题,正文内容和评论(由一个 Comment 结构数组表示)。

我们使用一个带有 range 的模板,将值绑定到HTML body中每个注入(insertion)的Comment的元素上。如果没有注入值,则输出默认 "No comments yet" 消息。

3、自定义函数

Template 包允许在模板中调用自定义函数。下面是一个将字符串转换为大写的示例的代码:

package main

import (

"os"

"strings"

"text/template"

)

func UpperCase(s string) string {

return strings.ToUpper(s)

}

func main() {

const tpl = `

{{.Title | UpperCase}}

{{.Title}}

{{.Content}}

`

data := struct {

Title string

Content string

}{

Title: "Golang的 Template包",

Content: "Golang的 Template包是一个用于生成文本输出的库。",

}

t := template.Must(template.New("tpl").Funcs(template.FuncMap{"UpperCase": UpperCase}).Parse(tpl))

t.Execute(os.Stdout, data)

}

在这个示例中,我们创建了一个函数 UpperCase,该函数将字符串转换为大写字母。然后我们将 FuncMap 导出到我们创建的模板之中。在模板中,使用“|”运算符将字符串传递给我们注册的 UpperCase 函数。

执行模板

template.Execute 函数将指定的数据结构填充到给定模板中。

如果要将生成的文本保存到文件中,可以使用 os.Create 函数打开文件并将其传递到 template.Execute 函数中。

总结

如果需要构建单纯的文本或 HTML 输出,Template包是一个方便和强大的选择。通过将视图和数据分离,能够很容易地创建一个可维护的代码基础。您可以使用条件、循环和自定函数使模板能够展示动态内容。 Template 包的基本语法非常简单,同时也可以与 web 应用框架结合起来使用以提供更动态、更有吸引力的内容。

参考链接:

- Golang Template 包

- Template 包

后端开发标签