英文源地址
Go为创建动态内容或使用text/template包向用户显示自定义输出提供了内置支持. 一个名为html/template的同级包提供了相同的API, 但具有额外的安全性, 应该用于生成HTML.
package main
import (
"os"
"text/template"
)
func main() {
// 我们可以创建一个新的模板, 并从字符串中解析它的主体.
// 模板是静态文本和包含在{
{...}},用于动态插入内容.
t1 := template.New("t1")
t1, err := t1.Parse("Value is {
{.}}\n")
if err != nil {
panic(err)
}
// 或者, 我们可以使用模板.
// 如果Parse返回错误, Must函数会触发panic.
// 这对于在全局作用域中初始化的模板尤其有用
t1 = template.Must(t1.Parse("Value: {
{.}}\n"))
// 通过Execute模板, 我们为其操作生成带有特定值的文本
// {
{.}}行为被作为参数传递给Execute的值所取代
t1.Execute(os.Stdout, "some text")
t1.Execute(os.Stdout, 5)
t1.Execute(os.Stdout, []string{
"Go",
"Rust",
"C++",
"C#",
})
// 我们将在下面使用的辅助函数
Create := func(name, t string) *template.Template {
return template.Must(template.New(name).Parse(t))
}
// 如果数据是结构体, 则可以使用{
{.FileName}}来访问它的字段.
// 这些字段应该导出, 以便在模板执行时可以访问.
t2 := Create("t2", "Name: {
{.Name}}\n")
t2.Execute(os.Stdout, struct {
Name string
}{
"Jane Doe"})
// 这同样适用于字典, 对于映射, 对键名的大小写没有限制
t2.Execute(os.Stdout, map[string]string{
"Name": "Mickey Mouse",
})
// if/else 模板提供条件执行.
// 如果一个值是类型的默认值, 例如0, 空字符串, nil指针等, 则该值被认为是false
// 这个示例演示了模板的另一个特性: 使用-in操作来修剪空格
t3 := Create("t3",
"{
{if . -}} yes {
{else -}} no {
{end}}\n")
t3.Execute(os.Stdout, "not empty")
t3.Execute(os.Stdout, "")
// range块允许我们循环遍历切片,数组,映射或通道.
// 在range块内{
{.}}被设置为迭代的当前项
t4 := Create("t4",
"Range: {
{range .}}{
{.}} {
{end}}\n")
t4.Execute(os.Stdout,
[]string{
"Go",
"Rust",
"C++",
"C#",
})
}
$ go run templates.go
Value: some text
Value: 5
Value: [Go Rust C++ C#]
Name: Jane Doe
Name: Mickey Mouse
yes
no
Range: Go Rust C++ C#
下一节将介绍: 正则表达式