模板
在这里可以理解为事先定义好的HTML文档文件
模板渲染
使用相应的数据去替换HTML文档中事先准备好的标记。也就是后端拿到数据,将其塞到模板里,最终生成html的文本,返回给浏览器的过程,跟浏览器的内核渲染不是一回事。
Go语言的模板引擎
Go语言内置了文本模板引擎text/template和用于HTML文档的html/template。它们的作用机制可以简单归纳如下:
- 模板文件通常定义为
.tmpl和.tpl为后缀(也可以使用其他的后缀),必须使用UTF8编码。 - 模板文件中使用
{{和}}包裹和标识需要传入的数据。 - 传给模板这样的数据就可以通过点号(
.)来访问,如果数据是复杂类型的数据,可以通过{{ .FieldName }}来访问它的字段。 - 除
{{和}}包裹的内容外,其他内容均不做修改原样输出。
Gin框架模板渲染与Go模板引擎的使用一致,可以分为三部分:定义模板文件、解析模板文件和模板渲染。
可以参考文章:Go语言标准库之http/template
不使用默认中间件
使用
r := gin.New()
代替
// Default 使用 Logger 和 Recovery 中间件
r := gin.Default()
多模板渲染
Gin框架中使用LoadHTMLGlob()或者LoadHTMLFiles()方法进行HTML模板渲染
LoadHTMLGlob支持正则表达式- 使用不同目录下相同的模板时,需要用
define定义名称,c.HTML(xx,"name",xx)中的name必须与引用的html文件内define定义的一致,且define和end成对出现。
func main() {
router := gin.Default()
router.LoadHTMLGlob("templates/**/*")//**代表目录,*代表文件
router.GET("/posts/index", func(c *gin.Context) {
c.HTML(http.StatusOK, "try/index.tmpl", gin.H{
"title": "Posts",
})
})
router.Run(":8080")
}
templates/posts/index.tmpl:
{{ define "try/index.tmpl" }}
<html>
<h1>
{{ .title }}
</h1>
<p>Using posts/index.tmpl</p>
</html>
{{ end }}
移除空格
可以使用{{-去掉去除模板内容左侧的所有空白符号,使用-}}去除模板内容右侧的所有空白符号。
{{- .title -}}
注意: -要紧挨{{和}},同时与模板值之间需要使用空格分隔。
pipeline
pipeline是指产生数据的操作。比如{{.}}、{{.Name}}等。Go的模板语法中支持使用管道符号|链接多个命令,用法和unix下的管道类似:,|前面一条命令的输出就是后面条命令的输入。
注意: 并不是只有使用了|才是pipeline。Go的模板语法中,pipeline的概念是传递数据,只要能产生数据的,都是pipeline。
除此之外,pipeline 中的函数还支持多个参数,2 个 3 个甚至多个参数都是支持的,除了管道前面的输出作为第一个参数之外,在函数后面接着的所有变量都是参数,依次排序。下面就是一个管道的示例:
.Name | toUpper | toEnglish
这里包含了 .Name 是一个变量,用于取值,然后 toUpper 和 toEnglish 都是函数,除了使用 .Name 用于取值之外,还支持 .Method 用于调用函数,那么这里的取值和调用方法的对象主体是谁?这就是在渲染这个模板的时候传进来的对象,所有关于 . 的操作都以这个传递的对象为基准进行操作。
变量
我们还可以在模板中声明变量,用来保存传入模板的数据或其他语句生成的结果。具体语法如下:
$obj := {{.}}
其中$obj是变量的名字,在后续的代码中就可以使用该变量了。
好文推荐: