Go 语言的模版语法

268 阅读3分钟

在Gin中的HTML渲染中,通常使用Go语言的模版语法,来完成HTML的生成,现在详细介绍一下整个模版语法的规则和内容。

Go的模板引擎采用了类似于Mustache模板引擎的语法,下面是一些基本的语法规则:

  1. {{ . }}:使用点(.)表示当前上下文的变量,例如:{{ .Title }} 表示渲染模板时使用的变量为 Title。
  2. {{if .Condition}} ... {{end}}:用于条件语句,其中 Condition 是一个表达式。如果 Condition 为 true,则渲染 ... 区域内的内容。
  3. {{range .List}} ... {{end}}:用于迭代一个列表,其中 List 是一个列表,可以是数组、切片、字典或通道。在 ... 区域内,可以使用当前迭代元素来渲染内容,例如:{{ . }}表示当前迭代元素本身。
  4. {{with .Value}} ... {{end}}:用于设置一个临时上下文,其中 Value 是一个表达式。在 ... 区域内,可以使用 Value 来渲染内容。
  5. {{template "name" .}}:用于渲染另一个模板,其中 name 是另一个模板的名称。使用 . 表示当前上下文,传递给渲染另一个模板。
  6. {{block "name" .}} ... {{end}}:用于定义一个块,其中 name 是块的名称。在 ... 区域内,可以使用当前上下文渲染内容。可以在渲染另一个模板时重载块。
  7. {{/* Comment */}}:用于添加注释。

除了这些基本语法之外,还有其他的语法规则,如定义变量、函数等,可以在需要的时候进行使用。需要注意的是,Go的模板引擎是类型安全的,因此必须在模板中明确变量的类型。

具体的例子如下

例子

输出变量

输出变量的语法是使用双花括号{{}}将变量包裹起来,例如:

<p>{{.}}</p>

注释

使用注释可以在模板中加入注释内容,例如:

{{/* This is a comment */}}

控制流

  • if/else

if语句可以用来控制模板中的代码块是否需要被执行,例如:

{{if .Condition}}
  <p>{{.Text}}</p>
{{else}}
  <p>No content available</p>
{{end}}
​
// 详细的例子
type Person struct {
    Name string
    Age  int
}
​
func main() {
    p := Person{"Alice", 20}
​
    t := template.Must(template.New("person").Parse(`
        {{if .Name}}
            Name: {{.Name}}
        {{else}}
            Name not found
        {{end}}
​
        {{if gt .Age 18}}
            Adult
        {{else}}
            Underage
        {{end}}
    `))
​
    if err := t.Execute(os.Stdout, p); err != nil {
        panic(err)
    }
}
​
​
​
  • range

range语句可以用来迭代数组、切片、map等数据结构,例如:

{{range .Data}}
  <p>{{.}}</p>
{{end}}
​
// 详细的例子
type Person struct {
    Name    string
    Age     int
    Address string
}
​
func main() {
    people := []Person{
        {"Alice", 20, "New York"},
        {"Bob", 30, "San Francisco"},
        {"Charlie", 40, "London"},
    }
​
    t := template.Must(template.New("people").Parse(`
        {{range .}}
            Name: {{.Name}}, Age: {{.Age}}, Address: {{.Address}}
        {{end}}
    `))
​
    if err := t.Execute(os.Stdout, people); err != nil {
        panic(err)
    }
}
​
  • with

with语句可以用来设置一个新的上下文环境,例如:

{{with .Data}}
  <p>{{.Text}}</p>
{{end}}

定义函数

可以使用函数来对模板中的变量进行格式化、计算等操作,可以在模板中定义自己的函数,例如:

{{func (name string) string}}
  <p>Hello, {{name}}!</p>
{{end}}
​
{{.Name | hello}}
​
//详细的例子type Person struct {
    Name string
    Age  int
}
​
func upper(str string) string {
    return strings.ToUpper(str)
}
​
func main() {
    p := Person{"Alice", 20}
​
    t := template.Must(template.New("person").Funcs(template.FuncMap{
        "upper": upper,
    }).Parse(`
        Name: {{.Name | upper}}, Age: {{.Age}}
    `))
​
    if err := t.Execute(os.Stdout, p); err != nil {
        panic(err)
    }
}
​

引入其他模板

可以使用模板文件中的 {{template}} 标签引入其他模板文件,例如:

{{define "header"}}
  <h1>{{.Title}}</h1>
{{end}}
​
{{template "header" .}}
​
//详细的例子type Person struct {
    Name string
    Age  int
}
​
func main() {
    p := Person{"Alice", 20}
​
    t := template.Must(template.New("person").Parse(`
        {{define "info"}}
            Name: {{.Name}}, Age: {{.Age}}
        {{end}}
​
        {{template "info" .}}
    `))
​
    if err := t.Execute(os.Stdout, p); err != nil {
        panic(err)
    }
}
​

以上是一些常用的Go模板引擎语法,更多详细信息可以参考Go语言官方文档中的模板引擎部分。

当然,如果想要更深入地学习Go语言中的模板语法,还可以查看Go官方文档中有关text/template和html/template包的说明。这些包提供了一组强大的工具来创建自定义模板和进行模板渲染,支持模板继承、条件语句、循环语句、自定义函数等高级功能。同时,这些包也提供了安全的模板渲染,可以防止代码注入等安全问题。掌握这些内容可以让你更加熟练地使用Go语言中的模板语法,并提升开发效率。