# Gin templates # Go Web 编程 ## gin 框架 templates * templates 的基础语法以及概念在前面的文章中有记录 * [HTML 基础概念](https://jicki.cn/golang/go/2000/01/01/golang-study-note-8 "HTML 基础") ### gin 下的例子 * go 代码 ```go package main import ( "fmt" "html/template" "net/http" "github.com/gin-gonic/gin" ) type User struct { Name string Age int Hobby []string } // template 语法 func main() { s1 := User{ Name: "张大仙", Age: 20, Hobby: []string{ "王者", "英雄联盟", "说骚话", }, } s2 := User{ Name: "魔教教主", Age: 30, Hobby: []string{ "英雄联盟", "刺激战场", "说骚话", }, } r := gin.Default() // 导入 自定义函数到 模板中 // 导入 自定义函数必须在 加载模板 之前,否则会报错 r.SetFuncMap(template.FuncMap{ "custom": func(name string) template.HTML { return template.HTML(fmt.Sprintf("hello %s", name)) }, }) // 加载模板 r.LoadHTMLGlob("templates/*") // html 基础 r.GET("/basic", func(c *gin.Context) { c.HTML(http.StatusOK, "basic.tmpl", gin.H{ "s1": s1, "s2": s2, }) }) // html 自定义函数 r.GET("/custom", func(c *gin.Context) { c.HTML(http.StatusOK, "custom.tmpl", gin.H{ "s1": s1, }) }) // html 嵌套 r.GET("/nest", func(c *gin.Context) { c.HTML(http.StatusOK, "nest.tmpl", nil) }) _ = r.Run(":8888") } ``` {% raw %} * html 代码 * basic.tmpl ```html HTML基础

欢迎光临 {{ .s1.Name }}

姓名: {{ .s1.Name }}

年龄: {{ .s1.Age }}

{{ $age := .s1.Age}} {{ if lt $age 22}}

{{ .s1.Name }} 好好学习

{{else}}

{{ .s1.Name }} 好好工作

{{end}}

爱好:
{{ range $index, $hobby := .s1.Hobby }} {{ $index }} - {{ $hobby }}

{{end}}
{{ with .s2 }}

欢迎光临 {{ .Name }}

姓名: {{ .Name }}

年龄: {{ .Age }}

{{ $age := .Age }} {{ if lt $age 22 }}

{{ .Name }} 好好学习

{{else}}

{{ .Name }} 好好工作

{{end}}

爱好:
{{ range $index, $hobby := .Hobby }} {{ $index }} - {{ $hobby }}

{{end}} {{end}}

index 取 s2 Hobby 索引为[2]的值 = {{index .s2.Hobby 2}}

``` * custom.tmpl ```html HTML 进阶 {{ with .s1 }}

{{ custom .Name }}

{{end}} ``` * nest.tmpl ```html HTML 嵌套 {{template "nesting" }}
{{template "temp"}} {{ define "temp"}}
  1. 青铜
  2. 白银
  3. 黄金
{{end}} ``` * nesting.tmpl ```html {{ define "nesting" }} HTML 嵌套的模板

HTML 嵌套模板

{{end}} ``` ### 自定义模板渲染符 * 自定义模板渲染符可使用 `r.Delims("左边符号", "右边符号")` 来重新定义。 * go 代码 ```go package main import ( "fmt" "html/template" "net/http" "github.com/gin-gonic/gin" ) type User struct { Name string Age int Hobby []string } // template 语法 func main() { s1 := User{ Name: "张大仙", Age: 20, Hobby: []string{ "王者", "英雄联盟", "说骚话", }, } s2 := User{ Name: "魔教教主", Age: 30, Hobby: []string{ "英雄联盟", "刺激战场", "说骚话", }, } r := gin.Default() // 自定义渲染分隔符 // 自定义渲染分隔符必须在 导入模板之前定义 r.Delims("{[{", "}]}") // 加载模板 r.LoadHTMLGlob("templates/*") // html 自定义渲染符号 r.GET("/delimit", func(c *gin.Context) { c.HTML(http.StatusOK, "delimit.tmpl", gin.H{ "name": s1.Name, "age": s1.Age, }) }) _ = r.Run(":8888") } ``` * html ```html HTML 自定义分隔符

姓名: {[{ .name }]}

年龄: {[{ .age }]}

``` ### 多模板继承 * Gin 框架下的模板都是单模板,多模板继承需要使用 第三方的包。 * `go get -u github.com/gin-contrib/multitemplate` * go 代码 ```go package main import ( "fmt" "html/template" "net/http" "github.com/gin-contrib/multitemplate" "github.com/gin-gonic/gin" ) type User struct { Name string Age int Hobby []string } // 创建一个方法用来处理多模板继承 func createMyRender() multitemplate.Renderer { r := multitemplate.NewRenderer() // 添加两个多模板继承, 初始模板必须写在前面。 r.AddFromFiles("index", "templates/inherit.tmpl", "templates/i1.tmpl") r.AddFromFiles("home", "templates/inherit.tmpl", "templates/i2.tmpl") return r } // html 继承 func main() { s1 := User{ Name: "张大仙", Age: 20, Hobby: []string{ "王者", "英雄联盟", "说骚话", }, } s2 := User{ Name: "魔教教主", Age: 30, Hobby: []string{ "英雄联盟", "刺激战场", "说骚话", }, } r := gin.Default() // 加载模板 r.LoadHTMLGlob("templates/*") // 接收多模板函数定义的返回值 r.HTMLRender = createMyRender() // 定义一个组 inGroup := r.Group("/inherit") { inGroup.GET("/index", func(c *gin.Context) { // 这里 c.HTML 写入的"index" 模板为 createMyRender 函数定义的名称 c.HTML(http.StatusOK, "index", gin.H{ "name": s1.Name, }) }) inGroup.GET("/home", func(c *gin.Context) { // 这里 c.HTML 写入的"home" 模板为 createMyRender 函数定义的名称 c.HTML(http.StatusOK, "home", gin.H{ "name": s2.Name, }) }) } _ = r.Run(":8888") } ``` * html 模板 * inherit.tmpl ```html HTML 继承
{{ block "content" . }} {{ end }}
``` * i1.tmpl ```html {{/*继承 inherit 模板*/}} {{template "inherit"}} {{/* 重新定义 inherit 模板中的内容 */}} {{define "content"}}

这是index页面

hello {{ .name }}

{{end}} ``` * i2.tmpl ```html {{/*继承 inherit 模板*/}} {{template "inherit"}} {{/* 重新定义 inherit 模板中的内容 */}} {{define "content"}}

这是home页面

hello {{ .name }}

{{end}} ``` {% endraw %}