总览
作为软件开发人员,文本无处不在。 代码是文本,HTML是文本,XNL / JSON / YAML / TOML是文本,Markdown是文本,CSV是文本。 所有这些文本格式旨在满足人类和机器的需求。 人类应该能够使用纯文本编辑器阅读和编辑文本格式。
但是在很多情况下,您需要以某种格式生成文本。 您可以从一种格式转换为另一种格式,创建自己的DSL,自动生成一些帮助程序代码,或者仅使用用户特定信息定制电子邮件。 不管有什么需要,Go凭借其强大的模板都可以在整个过程中为您提供帮助。
在本教程中,您将了解Go模板的来龙去脉,以及如何使用它们进行强大的文本生成。
什么是Go模板?
Go模板是使用特殊的占位符(称为动作)来管理某些文本的对象,这些占位符用双花括号括起来: {
{ some action }}
。 执行模板时,将为其提供Go结构,该结构具有占位符所需的数据。
这是一个产生敲打笑话的简单示例。 敲门笑话的格式很严格。 唯一改变的是门环和打Kong线的身份。
package main
import (
"text/template"
"os"
)
type Joke struct {
Who string
Punchline string
}
func main() {
t := template.New("Knock Knock Joke")
text := `Knock Knock\nWho's there?
{
{.Who}}
{
{.Who}} who?
{
{.Punchline}}
`
t.Parse(text)
jokes := []Joke{
{"Etch", "Bless you!"},
{"Cow goes", "No, cow goes moo!"},
}
for _, joke := range jokes {
t.Execute(os.Stdout, joke)
}
}
Output:
Knock Knock
Who's there?
Etch
Etch who?
Bless you!
Knock Knock
Who's there?
Cow goes
Cow goes who?
No, cow goes moo!
了解模板动作
模板语法非常强大,它支持诸如数据访问器,函数,管道,变量,条件和循环之类的操作。
资料存取器
数据访问器非常简单。 他们只是将数据从struct开始。 他们也可以深入嵌套结构:
func main() {
family := Family{
Father: Person{"Tarzan"},
Mother: Person{"Jane"},
ChildrenCount: 2,
}
t := template.New("Father")
text := "The father's name is {
{.Father.Name}}"
t.Parse(text)
t.Execute(os.Stdout, family)
}
如果数据不是结构,则可以仅使用{
{.}}