Go by Example: Text Templates

英文源地址
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# 

下一节将介绍: 正则表达式

猜你喜欢

转载自blog.csdn.net/weixin_43547795/article/details/130876766
今日推荐