Golang模板引擎使用指南

在Golang中使用模板引擎时,如何正确嵌套自定义函数?我按照官方文档操作,但渲染结果总是显示函数名而非返回值,不确定是注册方式有问题还是调用语法错误。另外想请教复杂结构体数据如何在模板中高效遍历,比如嵌套map和切片混合的场景?还有无推荐的方法避免模板渲染时因字段缺失导致的panic?

3 回复

Go语言内置的text/templatehtml/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/templatehtml/template是强大的模板引擎,适合生成文本和HTML。以下是一个简要使用指南:

  1. 基本结构

    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!

  2. 高级功能

    • 条件判断:使用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}}`))
      
  3. 注意点

    • 模板中的变量必须是导出字段(首字母大写)。
    • 对于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)
	}
}

常用模板语法

  1. 变量输出{{.FieldName}}
  2. 条件判断
{{if .Condition}}
  条件为真时显示
{{else}}
  条件为假时显示
{{end}}
  1. 循环
{{range .Items}}
  {{.}} <!-- 当前项 -->
{{end}}
  1. 模板嵌套
{{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
}

高级特性

  1. 自定义函数
t := template.New("test").Funcs(template.FuncMap{
	"add": func(a, b int) int { return a + b },
})

t.Parse("Result: {{add 1 2}}")
  1. 模板文件
t, err := template.ParseFiles("template.html")
  1. 模板目录
t, err := template.ParseGlob("templates/*.html")

Go的模板引擎简单但功能强大,特别适合生成HTML、配置文件等文本输出。对于更复杂的需求,可以考虑第三方库如pongo2等。

回到顶部