您是否需要以格式良好的输出、文本报告或HTML页面呈现一些数据?你可以使用Go模板来做到这一点。任何Go程序都可以使用text/template
或html/template
包(两者都包含在Go标准库中)来整齐地显示数据。
这两个包都允许你编写文本模板并将数据传递给它们,以按你喜欢的格式呈现文档。在模板中,可以遍历数据并使用条件逻辑来决定在文档中包含哪些项以及它们应该如何显示。本教程将向您展示如何使用这两个模板包。首先,你将使用text/template
将一些数据渲染为使用循环、条件逻辑和自定义函数的纯文本报告。然后你将使用html/template
将相同的数据渲染到一个没有代码注入的html文档中。
text/template
假设你想要生成一份关于狗的数据的简单报告。你希望像这样显示它:
---
Name: Jujube
Sex: Female (spayed)
Age: 10 months
Breed: German Shepherd/Pitbull
---
Name: Zephyr
Sex: Male (intact)
Age: 13 years, 3 months
Breed: German Shepherd/Border Collie
这是你将使用text/template
包生成的报告。突出显示的项目是您的数据,其余是来自模板的静态文本。模板要么以字符串的形式存在于代码中,要么与代码放在一起的文件中。它们包含与条件语句(即if/else)、流控制语句(即循环)和函数调用交织在一起的样板静态文本,所有这些都包装在{
{. . .}}
标记中。您将向模板传递一些数据以渲染像上面那样的最终文档。
首先,导航到你的Go工作空间(go env GOPATH
)并为这个项目创建一个新目录:
cd `go env GOPATH`
mkdir pets
cd pets
使用nano
或者你最喜欢的文本编辑器,打开一个名为pets.go
的新文件并粘贴以下内容:
nano pets.go
pets.go
package main
import (
"os"
"text/template"
)
func main() {
}
这个文件声明自己在main
包中,并包含一个main
函数,这意味着它可以使用go run
运行。它导入了text/template
标准库包,以允许你编写和渲染模板,以及os
,用于打印到终端。
在编写模板之前,让我们创建一些数据来传递给模板。在import
语句下面,main()
语句之前,定义一个名为Pet
的结构体,其中包含宠物的Name
、Sex
、宠物是否阉割(complete
)、Age
和Breed
字段。编辑pets.go
并添加以下结构体:
pets.go
. . .
type Pet struct {
Name string
Sex string
Intact bool
Age string
Breed string
}
. . .
现在,在main()
函数的主体中,创建一个Pet
的切片来保存关于两只狗的数据:
pets.go
. . .
func main() {
dogs := []Pet{
{
Name: "Jujube",
Sex: "Female",
Intact: false,
Age: "10 months",
Breed: "German Shepherd/Pitbull",
},
{
Name: "Zephyr",
Sex: "Male",
Intact: true,
Age: "13 years, 3 months",
Breed: "German Shepherd/Border Collie",
},
}
} // end main
这些数据将被传递到您的模板以渲染最终报告。当然,传递给模板的数据可以来自任何地方:数据库、第三方API等。对于本教程,最简单的方法是将一些示例数据粘贴到代码中。
现在让我们看看如何渲染(用这些包的术语来说就是执行)一个模板。
在这一步中,你将看到如何使用text/template
从模板生成一个完成的文档,但直到第4步,你才会真正编写一个有用的模板。
创建一个名为pets.tmpl
的空文本文件,其中包含一些静态文本:
pets.tmpl
Nothing here yet.
保存模板并退出编辑器。如果你使用的是nano
,按下CTRL+X
,然后Y
和ENTER
来确认你的更改。
虽然执行这个模板只会打印“Nothing here yet”。,让我们传入数据并执行模板,只是为了证明text/template
是有效的。在你的main()
函数中,在dogs
切片的后面添加以下代码:
pets.go
. . .
var tmplFile = “pets.tmpl”
tmpl, err := template.New(tmplFile).ParseFiles(tmplFile)
if err != nil {
panic(err)
}
err = tmpl.Execute(os.Stdout, dogs)
if err != nil {
panic(err)
}
} // end main
在这段代码中,你使用Template.New
来创建一个新的Template
,然后在生成的模板上调用ParseFiles
来解析你的最小模板文件。检查错误后,调用新模板的Execute
方法,传入os.Stdout
将完成的报告打印到终端,同时传入dogs
切片。对于第一个参数,您可以传入任何实现’ io.Writer '接口的东西,例如,您可以将报告写入文件。稍后我们将看到如何做到这一点。
完整的程序看起来应该像这样:
package main
import (
"os"
"text/template"
)
type Pet struct {
Name string
Sex string
Intact bool
Age string
Breed string
}
func main() {
dogs := []Pet{
{
Name: "Jujube",
Sex: "Female",
Intact: false,
Age: "10 months",
Breed: "German Shepherd/Pitbull",
},
{
Name: "Zephyr",
Sex: "Male",
Intact: true,
Age: "13 years, 3 months",
Breed: "German Shepherd/Border Collie",
},
}
var tmplFile = “pets.tmpl”
tmpl, err := template.New(tmplFile).ParseFiles(tmplFile)
if err != nil {
panic(err)
}
err = tmpl.Execute(os.Stdout, dogs)<