Go模板引擎 template基本语法

Go模板引擎的模板表达式都包括在 {{ 和 }} 之间。

 

1. go template 语法和使用

Go模板引擎的语法格式:{{ 模板表达式 }} 。

在模版文件中通过 点( . ) 引用模版参数。因为在渲染模版的时候只能传入一个参数,所以 点( . ) 正好可以代表模版参数的引用。

模版参数支持数字、布尔值、字符串、map、struct、数组类型。

 

2. int/bool/string 类型参数

模版参数为 int/bool/string 类型,可以直接用点( . ) 引用即可。

{{define "demo"}}
这是测试内容:{{.}}
{{end}}

然后通过传入参数,对模板进行渲染:

// 渲染 demo 模版,传入字符串参数 "欢迎访问编程宝库"
t.ExecuteTemplate(os.Stdout, "demo", "欢迎访问编程宝库")

模版中 {{.}} 被 “欢迎访问编程宝库” 代替,输出:

欢迎访问编程宝库

整体代码如下:

package main

import (
    "log"
    "os"
    "text/template"
)

func main() {
    t := template.Must(template.ParseGlob("./views/*.tpl"))

    content := "Hello World, 编程宝库"
    err := t.ExecuteTemplate(os.Stdout, "demo", content)
    if err != nil {
        log.Println("executing template:", err)
    }
}    

 

3. map/struct 类型参数

如果要传入多个模版参数,一般都使用 map 或者 struct 类型。

引用语法格式:

{{.字段名}}

嵌套的 struct 或者 map 类型引用语法格式:

{{.字段名1.字段名2}}

使用 点( . ) 连接多个字段名,就可以访问多层嵌套的 struct/map 类型数据。

使用 map/struct 类型参数的范例:

// 定义struct模版参数
type User struct {
	Name  string 
}

type Order struct {
    Id     int
	Title  string
	Customer User  //嵌套字段
}

// 初始化模版参数
food := Order{
    Id:  10,
    Title: "柠檬",
    Customer: User{
        Name: "李大春"
    }
}

// 渲染demo模版, 模版参数为food
t.ExecuteTemplate(os.Stdout, "demo", food)

模版文件代码:

商品名: {{.Title}}
用户名: {{.Customer.Name}}

运行输出结果:

商品名: 柠檬
用户名: 李大春

如果模板参数传入数组,则需要循环语句处理输出,后面的章节会介绍range循环语句用法。

 

4. 模版变量

在模版中也可以自定义变量, 类似 golang 使用 := 符号定义变量,语法如下:

$变量名 := 数据

变量名需要以 $ 美元符号开头。

模版变量范例:

// 定义变量
$title := "标题"
// 为变量赋值, 第二次为变量赋值,不需要冒号:
$title = "新标题"

// 引用变量
{{$title}}

 

5. 注释

Go 模板引擎的注释格式: {{/* 注释语法 */}}。

 

6. 删除空格处理

有时候我们输出表达式结果的时候,在表达式结果左右两边都会携带一些空格。

下面是删除表达式结果左右两边空格的语法:

  • 在左边增加减号空格,表示删除左边空格: {{- 模板表达式 }}
  • 在右边增加空格减号,表示删除右边空格: {{ 模板表达式 -}}
  • 删除表达式左右两边空格的写法: {{- 模板表达式 -}}

删除空格处理范例:

"{{23 -}} < {{- 45}}"

输出:

"23<45"

23和45之间的空格都被删除了

Go模板引擎的流程控制语句主要是 if/range/with 三种语句。if 语句:语法格式1:表达式为真,则执输出T1,{{if 表达式}} T1 {{end}}。range 循环语句:{{range 数组引用}} {{.}} {{end}}。with 语句:with 语句主要用于 struct 类型数据的访问,就是一种快速访问 struct 数据的方式。