Golang模板引擎使用指南
在Golang中使用模板引擎时,如何正确嵌套自定义函数?我按照官方文档操作,但渲染结果总是显示函数名而非返回值,不确定是注册方式有问题还是调用语法错误。另外想请教复杂结构体数据如何在模板中高效遍历,比如嵌套map和切片混合的场景?还有无推荐的方法避免模板渲染时因字段缺失导致的panic?
3 回复
Go语言内置的text/template
和html/template
是强大的模板引擎。首先,导入text/template
包,定义模板字符串或加载外部模板文件。
示例代码:
package main
import (
"html/template"
"os"
)
type User struct {
Name string
Age int
}
func main() {
tmpl := template.Must(template.New("example").Parse(`Hello {{.Name}}, you are {{.Age}} years old.`))
user := User{Name: "Alice", Age: 25}
err := tmpl.Execute(os.Stdout, user)
if err != nil {
panic(err)
}
}
常用功能包括数据绑定、条件判断、循环遍历等。例如:
- 条件:
{{if .Condition}}{{end}}
- 循环:
{{range .Items}}{{end}}
- 转义HTML:使用
html/template
避免XSS攻击。
此外,可通过template.FuncMap
注册自定义函数,增强模板功能。模板引擎适用于Web开发中的页面渲染场景。
更多关于Golang模板引擎使用指南的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Go语言自带的text/template
和html/template
是强大的模板引擎,适合生成文本和HTML。以下是一个简要使用指南:
-
基本结构:
package main import ( "bytes" "text/template" "os" ) func main() { data := map[string]string{"Name": "Golang"} tmpl := `Hello, {{.Name}}!` t := template.Must(template.New("test").Parse(tmpl)) var buf bytes.Buffer if err := t.Execute(&buf, data); err != nil { panic(err) } os.Stdout.WriteString(buf.String()) }
上述代码将输出:
Hello, Golang!
-
高级功能:
- 条件判断:使用
if
,else
,with
等。t := template.Must(template.New("").Parse(`{{if .IsAdmin}}Admin{{else}}User{{end}}`))
- 循环:使用
range
遍历数组或映射。t := template.Must(template.New("").Parse(`{{range .Names}}{{.}}, {{end}}`))
- 自定义函数:通过
Funcs
注册自定义方法。t := template.Must(template.New("").Funcs(template.FuncMap{"upper": strings.ToUpper}).Parse(`{{upper .Name}}`))
- 条件判断:使用
-
注意点:
- 模板中的变量必须是导出字段(首字母大写)。
- 对于HTML生成,推荐使用
html/template
以防止XSS攻击。
Golang模板简洁高效,适合快速构建动态内容。
Golang模板引擎使用指南
Go语言的标准库提供了功能强大的模板引擎(text/template和html/template),主要用于生成文本输出。以下是基本使用指南:
基础用法
package main
import (
"os"
"text/template"
)
func main() {
// 定义模板
tmpl := `Hello, {{.Name}}! Today is {{.Day}}.`
// 解析模板
t, err := template.New("greeting").Parse(tmpl)
if err != nil {
panic(err)
}
// 准备数据
data := struct {
Name string
Day string
}{
Name: "Gopher",
Day: "Monday",
}
// 执行模板
err = t.Execute(os.Stdout, data)
if err != nil {
panic(err)
}
}
常用模板语法
- 变量输出:
{{.FieldName}}
- 条件判断:
{{if .Condition}}
条件为真时显示
{{else}}
条件为假时显示
{{end}}
- 循环:
{{range .Items}}
{{.}} <!-- 当前项 -->
{{end}}
- 模板嵌套:
{{template "header" .}}
HTML模板(安全过滤)
package main
import (
"html/template"
"os"
)
func main() {
tmpl := `<h1>{{.Title}}</h1><p>{{.Content}}</p>`
t := template.Must(template.New("webpage").Parse(tmpl))
data := struct {
Title string
Content string
}{
Title: "My Page",
Content: "<script>alert('xss')</script>",
}
t.Execute(os.Stdout, data) // 会自动转义HTML
}
高级特性
- 自定义函数:
t := template.New("test").Funcs(template.FuncMap{
"add": func(a, b int) int { return a + b },
})
t.Parse("Result: {{add 1 2}}")
- 模板文件:
t, err := template.ParseFiles("template.html")
- 模板目录:
t, err := template.ParseGlob("templates/*.html")
Go的模板引擎简单但功能强大,特别适合生成HTML、配置文件等文本输出。对于更复杂的需求,可以考虑第三方库如pongo2等。