这是我参与[第五届青训营]的第十六天
在golang项目中,可以对同名的文件进行定义,go语言对.tmpl文件可以进行自定义的程序判断内容,进行template的渲染和pipeline传参。
{{define "posts/index.tmpl"}}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="id=edge">
<title>posts/index</title>
</head>
<body>
{{.title}}
</body>
</html>
{{end}}
Go语言内置了文本模板引擎text/template和用于HTML文档的html/template。它们的作用机制可以简单归纳如下:
- 模板文件通常定义为
.tmpl和.tpl为后缀(也可以使用其他的后缀),必须使用UTF8编码。 - 模板文件中使用
{{和}}包裹和标识需要传入的数据。 - 传给模板这样的数据就可以通过点号(
.)来访问,如果数据是复杂类型的数据,可以通过{ { .FieldName }}来访问它的字段。 - 除
{{和}}包裹的内容外,其他内容均不做修改原样输出。
// 静态文件
// html页面上用到的样式文件./xxx/picture/ js文件 图片
func main() {
r := gin.Default()
// 加载静态文件
r.Static("/xxx", "./statics")
// gin框架中给模板参加自定义函数
r.SetFuncMap(template.FuncMap{
"safe": func(str string) template.HTML {
return template.HTML(str)
},
})
//r.LoadHTMLFiles("templates/index.tmpl") // 模板解析
r.LoadHTMLGlob("templates/**/*")
r.GET("/posts/index", func(c *gin.Context) {
// HTTP请求
c.HTML(http.StatusOK, "posts/index.tmpl", gin.H{ //模板渲染
"title": "itistimetocode.com",
})
})
r.GET("/users/index", func(c *gin.Context) {
// HTTP请求
c.HTML(http.StatusOK, "users/index.tmpl", gin.H{ //模板渲染
"title": "<a href='https://itistimetocode.com'>chaodyna的博客</a>",
})
})
// 返回从网上下载的模板
r.GET("/home", func(c *gin.Context) {
c.HTML(http.StatusOK, "home.html", nil)
})
r.Run(":9090") // 启动server
}
在go语言中,可以定义自定义函数,使得被转义的传递的字符串,重新定义为原本的程序代码,比如前端使用的html,css和js语法等。
pipeline是指产生数据的操作。比如{{.}}、{{.Name}}等。Go的模板语法中支持使用管道符号|链接多个命令,用法和unix下的管道类似:|前面的命令会将运算结果(或返回值)传递给后一个命令的最后一个位置。