推荐答案
在 Go 语言中,使用 text/template
或 html/template
包可以方便地生成文本或 HTML 输出。以下是一个简单的示例,展示如何使用模板:
-- -------------------- ---- ------- ------- ---- ------ - ----- ---------------- - ---- ------ ------ - ----- ------ ---- --- - ---- ------ - --- ---- ------ ---- - ------ ---------- ---- --------- --- ------- --- --- -- ---------------------------------- --- --- -- --- - ------------ -- --- -- -- -- ------------ -------- ---- --- --- ------------ ---- - -------------------- -- --- --- -- --- - ------------ -- -
本题详细解读
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 输出。