如何在Go中使用模板

2023-12-25 12:08:43

引言

您是否需要以格式良好的输出、文本报告或HTML页面呈现一些数据?你可以使用Go模板来做到这一点。任何Go程序都可以使用text/templatehtml/template包(两者都包含在Go标准库中)来整齐地显示数据。

这两个包都允许你编写文本模板并将数据传递给它们,以按你喜欢的格式呈现文档。在模板中,可以遍历数据并使用条件逻辑来决定在文档中包含哪些项以及它们应该如何显示。本教程将向您展示如何使用这两个模板包。首先,你将使用text/template将一些数据渲染为使用循环、条件逻辑和自定义函数的纯文本报告。然后你将使用html/template将相同的数据渲染到一个没有代码注入的html文档中。

前期准备

步骤1 -导入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,用于打印到终端。

步骤2 -创建模板数据

在编写模板之前,让我们创建一些数据来传递给模板。在import语句下面,main()语句之前,定义一个名为Pet的结构体,其中包含宠物的NameSex、宠物是否阉割(complete)、AgeBreed字段。编辑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等。对于本教程,最简单的方法是将一些示例数据粘贴到代码中。

现在让我们看看如何渲染(用这些包的术语来说就是执行)一个模板。

步骤3 -执行模板

在这一步中,你将看到如何使用text/template从模板生成一个完成的文档,但直到第4步,你才会真正编写一个有用的模板。

创建一个名为pets.tmpl的空文本文件,其中包含一些静态文本:

pets.tmpl

Nothing here yet.

保存模板并退出编辑器。如果你使用的是nano,按下CTRL+X,然后YENTER来确认你的更改。

虽然执行这个模板只会打印“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)<

文章来源:https://blog.csdn.net/QIU176161650/article/details/135194786
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。