Golang 中的模板是一项强大的功能,可以创建动态内容或向用户显示自定义输出。 Golang 有两个带有模板的包:
- 文本/模板
- html/模板
模板主要有3个部分,如下所示:
1. 行动
它们是数据评估、循环或函数等控制结构。操作由 {{ 和 }} 分隔,其中根元素通过在大括号 {{.}} 中使用点运算符(.) 来显示。这些操作控制最终输出的外观。
要放置当前 struct 对象的字段的值,请在字段名称前加上点运算符(.) 在花括号内,如{{.FieldName}} 。在其中评估的数据称为管道。
2. 条件
if-else构造也可以在模板中使用。例如,要仅在条件为真时执行模板,我们可以使用以下语法:
{{if .condition}} temp_0 {{else if .condition}} temp_1 {{else}} temp_2 {{end}}
这将执行第一个模板 temp_0,如果第一个条件成立,如果第二个条件成立,则第二个模板 temp_1 将执行,否则第三个模板 temp_2 将执行。
3. 循环
也可以使用range操作在模板中使用迭代。在模板中循环的语法是:
{{range .List}} temp_0 {{else}} temp_1 {{end}}
这里 List 应该是一个数组、映射或切片,如果长度为 0,那么模板 temp_1 将被执行,否则它会遍历 List 上的元素。
模板的输入格式应为 UTF-8 编码格式。外面的任何其他文本都按原样打印到标准输出。预定义变量os.Stdout指的是标准输出,用于打印出合并后的数据。 Execute()函数采用任何实现 Writer 接口的值,并将解析的模板应用于指定的数据对象。
示例 1:
// Golang program to illustrate the
// concept of text/templates
package main
import (
"os"
"fmt"
"text/template"
)
// declaring a struct
type Student struct{
// declaring fields which are
// exported and accessible
// outside of package as they
// begin with a capital letter
Name string
Marks int64
}
// main function
func main() {
// defining an object of struct
std1 := Student{"Vani", 94}
// "New" creates a new template
// with name passed as argument
tmp1 := template.New("Template_1")
// "Parse" parses a string into a template
tmp1, _ = tmp1.Parse("Hello {{.Name}}, your marks are {{.Marks}}%!")
// standard output to print merged data
err := tmp1.Execute(os.Stdout, std1)
// if there is no error,
// prints the output
if err != nil {
fmt.Println(err)
}
}
输出:
Hello Vani, your marks are 94%!
包模板“html/template”提供了与“text/template”相同的接口,但它具有文本输出,它实现了用于生成HTML 输出的数据驱动模板。此 HTML 输出对于任何外部代码注入都是安全的。
示例 2:
“index.html”文件:
Results
Hello, {{.Name}}, ID number: {{.Id}}
You have scored {{.Marks}}!
“main.go”文件:
// Golang program to illustrate the
// concept of html/templates
package main
import (
"html/template"
"os"
)
// declaring struct
type Student struct {
// defining struct fields
Name string
Marks int
Id string
}
// main function
func main() {
// defining struct instance
std1 := Student{"Vani", 94, "20024"}
// Parsing the required html
// file in same directory
t, err := template.ParseFiles("index.html")
// standard output to print merged data
err = t.Execute(os.Stdout, std1)
}
输出:
Page Title
Hello, Vani, ID number: 20024
You have scored 94!