推荐答案
在 Go 语言中,使用 text/template 或 html/template 包可以方便地生成文本或 HTML 输出。以下是一个简单的示例,展示如何使用模板:
// www.javascriptcn.com code example
package main
import (
"os"
"text/template"
)
type Person struct {
Name string
Age int
}
func main() {
// 定义模板
const tmpl = `Name: {{.Name}}, Age: {{.Age}}`
// 创建模板并解析
t, err := template.New("person").Parse(tmpl)
if err != nil {
panic(err)
}
// 数据
p := Person{Name: "Alice", Age: 30}
// 执行模板并输出到标准输出
err = t.Execute(os.Stdout, p)
if err != nil {
panic(err)
}
}本题详细解读
1. 模板定义
在 Go 中,模板是通过字符串定义的。模板中的 {{.FieldName}} 是占位符,表示在模板执行时会被替换为结构体中的对应字段值。
const tmpl = `Name: {{.Name}}, Age: {{.Age}}`2. 模板解析
使用 template.New 创建一个新的模板,并通过 Parse 方法解析模板字符串。
t, err := template.New("person").Parse(tmpl)
if err != nil {
panic(err)
}3. 数据传递
模板执行时需要传入一个数据结构,通常是结构体或 map。模板中的占位符会根据传入的数据结构进行替换。
p := Person{Name: "Alice", Age: 30}4. 模板执行
使用 Execute 方法执行模板,并将结果输出到指定的 io.Writer,如 os.Stdout。
err = t.Execute(os.Stdout, p)
if err != nil {
panic(err)
}5. 高级用法
- 条件判断:可以在模板中使用
{{if .Condition}}...{{end}}进行条件判断。 - 循环:使用
{{range .Items}}...{{end}}进行循环操作。 - 函数调用:可以在模板中调用自定义函数,通过
template.FuncMap注册函数。
funcMap := template.FuncMap{
"toUpper": strings.ToUpper,
}
t := template.New("example").Funcs(funcMap)
t, _ = t.Parse(`{{. | toUpper}}`)
t.Execute(os.Stdout, "hello")6. HTML 模板
对于生成 HTML 内容,建议使用 html/template 包,它提供了自动转义功能,防止 XSS 攻击。
import "html/template"
t := template.Must(template.New("example").Parse(`<h1>{{.Title}}</h1>`))
t.Execute(os.Stdout, map[string]string{"Title": "<script>alert('xss')</script>"})7. 模板嵌套
可以通过 {{template "name" .}} 在模板中嵌套其他模板。
const baseTmpl = `{{template "content" .}}`
const contentTmpl = `Content: {{.}}`
t := template.Must(template.New("base").Parse(baseTmpl))
t = template.Must(t.New("content").Parse(contentTmpl))
t.Execute(os.Stdout, "Hello, World!")通过这些步骤,你可以在 Go 中灵活地使用模板生成各种文本或 HTML 输出。