Golang中的模板(Template)引擎使用指南

我在学习Go语言的模板引擎时遇到了一些困惑。想请教大家几个问题:1) 如何正确创建和使用text/template和html/template?2) 模板中的变量、函数和管道操作具体该怎么使用?3) 如何实现模板嵌套和布局复用?4) 在web开发中,怎样安全地处理用户输入防止XSS攻击?5) 有没有性能优化的建议或最佳实践?希望能得到一些实际应用的例子和经验分享。

3 回复

Go语言内置的text/templatehtml/template是两个常用的模板引擎。html/template更安全,专用于生成HTML。

  1. 基础用法:首先导入text/template包。定义模板字符串或读取外部文件。使用template.New()创建模板实例,通过Parse()解析模板内容。例如:

    t := template.Must(template.New("test").Parse(`Hello, {{.}}!`))
    err := t.Execute(os.Stdout, "World")
    
  2. 数据绑定:模板中的{{.}}表示传入的数据。可以传递结构体、map等。例如:

    type Person struct {
        Name string
        Age  int
    }
    t.Execute(os.Stdout, Person{Name: "Alice", Age: 25})
    
  3. 条件与循环:支持if, else, with, range等逻辑。例如:

    {{if .Name}}Hello, {{.Name}}{{end}}
    {{range .Names}}- {{.}}{{end}}
    
  4. 函数扩展:可通过Funcs()添加自定义函数。例如:

    t.Funcs(template.FuncMap{"upper": strings.ToUpper})
    
  5. 安全性:使用html/template时会自动转义HTML字符,避免XSS攻击。

  6. 错误处理:建议使用Must()简化错误处理,快速退出程序。

  7. 性能优化:模板编译后可缓存,避免重复解析。

更多关于Golang中的模板(Template)引擎使用指南的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Go语言内置的text/templatehtml/template是强大的模板引擎。首先,定义模板字符串或加载外部模板文件。

示例代码:

package main

import (
	"html/template"
	"os"
)

type User struct {
	Name string
	Age  int
}

func main() {
	// 定义模板
 tmpl := template.Must(template.New("user").Parse(`Hello {{.Name}}, you are {{.Age}} years old.`))

	// 数据
 user := User{Name: "John", Age: 25}

	// 渲染
 err := tmpl.Execute(os.Stdout, user)
 if err != nil {
	 panic(err)
 }
}

关键点:

  1. template.Parse解析模板。
  2. Execute方法将数据渲染到模板。
  3. html/template用于HTML场景,自动转义防止XSS。

模板语法包括变量({{.}})、条件({{if}})、循环({{range}})等。记得处理错误,尤其是模板解析阶段。模板引擎适合生成动态内容,但对复杂逻辑建议在业务层处理。

Go语言模板(Template)引擎使用指南

Go标准库中的text/templatehtml/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: "John",
		Day:  "Monday",
	}

	err = t.Execute(os.Stdout, data)
	if err != nil {
		panic(err)
	}
}

常用模板语法

  1. 变量输出{{.FieldName}}
  2. 条件语句
    {{if .Condition}}
      Show this
    {{else}}
      Show that
    {{end}}
    
  3. 循环语句
    {{range .Items}}
      {{.}}  // 当前项
    {{end}}
    
  4. 模板嵌套
    {{template "header" .}}
    

安全HTML输出

使用html/template包可以自动转义HTML内容,防止XSS攻击:

import "html/template"

tmpl := `<p>{{.Content}}</p>` // 自动转义
t := template.Must(template.New("html").Parse(tmpl))

实用技巧

  1. 自定义函数
funcMap := template.FuncMap{
    "upper": strings.ToUpper,
}

t := template.New("").Funcs(funcMap).Parse(`{{upper .Name}}`)
  1. 文件模板
t, err := template.ParseFiles("template.html")
  1. 模板继承
{{define "base"}}
<html>
  <body>
    {{template "content" .}}
  </body>
</html>
{{end}}

{{define "content"}}...{{end}}

Go模板引擎简洁但功能强大,适合生成各种文本格式的输出,特别是HTML页面。

回到顶部