GO_Template学习笔记 | 豆包MarsCode AI刷题

64 阅读3分钟

在学习字节仿抖音商城项目时,用到了go template模版,在C++当中没有接触到类似的概念,感觉十分的有趣,便记录一下其基本的使用方法,希望能对大家有所帮助。


一、Go Template

Go Template 是 Go 语言内置的模板引擎,它通过占位符和模版语言将数据渲染到文本中去,生成 HTML、邮件、配置文件等动态内容。

Go 提供了两个主要的模板包:

  • text/template:用于生成纯文本输出。
  • html/template:专门为 HTML 输出设计,具备防止 XSS 攻击的功能。

二、基本语法

1. 模板定义与渲染

func main() {
	tmpl := `Hello, {{.Name}}!`
	data := &struct{ 
            Name:"Alice"
        }
	t := template.Must(template.New("template_name").Parse(tmpl))
	t.Execute(os.Stdout, data)
}

下面讲解一下所用到的函数:

1.1 template.New("template_name")
  • 作用:创建一个新的模板实例,并为它指定一个名称。
  • 参数:模板名称(字符串),如 "example"
  • 返回值:返回一个 *template.Template 对象。

名称用于标识模板,尤其在多模板时可以通过名称引用特定模板。

```
tmpl := template.New("example")
```

1.2. Parse(tmpl)
  • 作用:解析模板字符串,将模板内容编译为可执行的模板。
  • 参数:模板内容(字符串),如 tmpl
  • 返回值:返回更新后的模板对象,或者一个解析错误。

模板字符串中可以包含占位符(如 {{.}})。

```
tmpl := `Hello, {{.Name}}!`
t, err := template.New("example").Parse(tmpl)
if err != nil {
    log.Fatal(err)
}
```

1.3. template.Must()
  • 作用:包装一个模板对象,并在解析失败时直接引发 panic,简化错误处理。
  • 参数:接受一个模板对象或解析的结果。
  • 返回值:返回成功解析的模板对象。

常用于初始化模板,因为模板语法错误一般是编程时的错误,直接 panic 有助于尽早发现问题。

```
t := template.Must(template.New("example").Parse(tmpl))
```

2. 常用模板指令

指令含义示例
{{.}}当前对象{{.}} 输出整个对象。
{{.Field}}访问对象的字段{{.Name}} 输出 Name 字段。
{{if}}...{{end}}条件判断{{if .Active}}Active{{end}}
{{range}}...{{end}}遍历集合{{range .Items}}{{.}}{{end}}
{{with}}...{{end}}设置新上下文{{with .User}}{{.Name}}{{end}}
{{define}}...{{end}}定义子模板{{define "T1"}}Hello{{end}}
{{template}}引用子模板{{template "T1"}}

在编写HTML时只需编写主体部分即可,头部和尾部可以直接引用模拟便可以快速编写HTML文档。如下:

{{ template "header" .}}
<div >       
  content...
</div>
{{ template "footer" .}}

3. 函数使用

Go Template 支持内置函数和自定义函数。

  • 内置函数:常用函数如 len、print 等。
  • 自定义函数
func main() {
	funcMap := template.FuncMap{
		"upper": func(s string) string {
			return strings.ToUpper(s)
		},
	}

	tmpl := `{{upper .Name}}`
	t := template.Must(template.New("example").Funcs(funcMap).Parse(tmpl))
	data := map[string]string{"Name": "alice"}
	t.Execute(os.Stdout, data)
}

三、模板嵌套与继承

可以通过 {{template}} 指令实现模板的复用。

{{define "base"}}
<html>
  <body>
    {{template "content" .}}
  </body>
</html>
{{end}}

{{define "content"}}Hello, {{.Name}}{{end}}

四、注意事项

  • 防止模板注入:尤其是使用 text/template 时,要确保数据的合法性。
  • 模板解析错误处理:建议使用 template.Must 简化错误处理,但在生产环境中需注意捕获和处理错误。
  • 调试技巧:可以将模板输出到标准输出或文件,便于调试渲染结果。

总结

在使用Go Template时感觉其语法十分简单但功能强大,尤其是在生成 HTML 和配置文件时,非常高效。并且得益于将模版嵌套机制极大的提高了代码复用率,便于维护和扩展。此外它还保证了对 XSS 攻击的免疫,即一种常见的网络攻击方式,攻击者通过向网页注入恶意脚本,使其在其他用户的浏览器中执行。XSS 攻击通常会导致用户数据泄露、会话劫持、钓鱼攻击等安全问题。而Go Template自带对XSS攻击的免疫,这对web开发而言时相当重要的。