介绍
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 应用框架结合起来使用以提供更动态、更有吸引力的内容。
参考链接: