template包用于处理使用字符串模板和数据驱动生成目标字符串,在字符串模板中可使用数据显示、流程控制、函数、管道、子模版等功能

常用函数

  • HTMLEscape:对字节切片内容进行特殊字符(\000, “, ‘, &,>,<)进行HTML转码后输出到输出流
  • HTMLEscapeString:对字符串进行特殊字符同上进行HTML转码为字符串
  • HTMLEscaper: 将可变参数转化为字符串并对其中的特殊字符同上进行HTML转码的字符串
  • JSEscape: 对字节切片内容进行特殊字符(\,’,”,’,<,不可打印字符)进行JS转码后输出到输出流
  • JSEscapeString: 对字符串进行特殊字符同上进行JS转码为字符串
  • JSEscaper: 将可变参数转化为字符串并对其中的特殊字符同上进行JS转码的字符串

    常用结构体

  • Template

常用函数

  • New: 创建模板
  • ParseFiles: 指定文件模板
  • ParseGlob: 指定文件模板匹配格式
  • Must: 帮助函数,对模板创建结果进行验证,并返回模板对象指针

常用方法

  • Parse: 解析模板字符串
  • ParseFiles: 指定文件模板
  • ParseGlob: 指定文件模板匹配格式
  • Execute: 模板渲染
  • ExecteTemplate: 指定模板执行模板渲染
  • Funcs: 指定自定义函数字典
  • Clone: 克隆模板进行模板复用

功能

  • 显示数据
  • 条件表达式
  • range表达式
  • 定义变量
  • with表达式(上下文)
  • 使用内置函数
  • 使用自定义函数
  • 使用block定义默认内容
  • 模板嵌入
  • 指定解析模板
  • 从文件解析模板
  • 解析匹配的文件路径的模板文件

    实操

    learnTextTemplate.go

    ```go package learnTextTemp

import ( “fmt” “html/template” “os” “strings” )

func LearnTextTemp() { // JSEscaper fmt.Println(template.HTMLEscapeString(“

ligz
“)) fmt.Println(template.JSEscapeString(“
ligz
“))

  1. // 显示数据
  2. // 显示信息
  3. txt := `show var:

{{.}}` tpl, _ := template.New(“tpl”).Parse(txt) tpl.Execute(os.Stdout, “ligz”)

  1. fmt.Println()
  2. // 显示切片元素
  3. txt = `show slice:

{{ index . 0 }} {{ index . 1 }} ` tpl, _ = template.New(“tpl”).Parse(txt) tpl.Execute(os.Stdout, []string{“silence”, “ligz”})

  1. fmt.Println()
  2. // 显示映射元素
  3. txt = `show map:

{{ .name }} {{ .addr }} ` tpl, _ = template.New(“tpl”).Parse(txt) tpl.Execute(os.Stdout, map[string]string{“name”: “ligz”, “addr”: “通州区”})

  1. // 条件表达式
  2. // if else 表达式
  3. txt = `if-else:

{{ if . }} True {{ else }} False {{ end }}` tpl, _ = template.New(“tpl”).Parse(txt) tpl.Execute(os.Stdout, true) tpl.Execute(os.Stdout, false)

  1. // if else-if else 表达式
  2. txt = `if-elseif-else:

{{ if eq . “white” }} WHITE {{ else if eq . “blcak” }} BLACK {{ else }} unknow {{ end }}` tpl, _ = template.New(“tpl”).Parse(txt) tpl.Execute(os.Stdout, “white”) tpl.Execute(os.Stdout, “black”) tpl.Execute(os.Stdout, “red”)

  1. // range 表达式
  2. txt = `range:

{{ range . }} {{ . }} {{ end }}` tpl, _ = template.New(“tpl”).Parse(txt) tpl.Execute(os.Stdout, []string{“white”, “black”, “red”})

  1. // 属性显示、 if-else 表达式
  2. txt = `

Title: {{ .Title }} Students: {{ range .Students }} 学号: {{ .ID}} 姓名: {{ .Name }} 性别: {{ if .Gender }} 男 {{ else }} 女 {{ end }} {{ else }} 无学生信息 {{ end }}` type Student struct { ID int Name string Gender bool }

  1. type Classs struct {
  2. Title string
  3. Students []Student
  4. }
  5. tpl, _ = template.New("tpl").Parse(txt)
  6. tpl.Execute(os.Stdout, Classs{
  7. Title: "三年纪二班",
  8. Students: []Student{
  9. {ID:1, Name: "ligz", Gender: true},
  10. },
  11. })
  12. tpl.Execute(os.Stdout, Classs{
  13. Title: "三年级二班",
  14. Students: []Student{},
  15. })
  16. // range 表达式
  17. txt = `

Title: {{ .Title }} Students: {{ range .Students }} 学号: {{ .ID}} 姓名: {{ .Name }} 性别: {{ if .Gender }} 男 {{ else }} 女 {{ end }} {{ else }} 无学生信息 {{ end }}tpl, _ = template.New("tpl").Parse(txt) tpl.Execute(os.Stdout, []Classs{ { Title: "三年级三班", Students: []Student{ {ID: 1,Name: "ligz", Gender: true}, }, },{ Title: "三年级五班", Students: []Student{ {ID: 2, Name: "ligz", Gender: true}, }, }, }) // 定义变量 txt = {{ $boy := false }}

{{ if $boy }} 男 {{ else }} 女 {{ end }}` tpl, _ = template.New(“tpl”).Parse(txt) tpl.Execute(os.Stdout, nil)

  1. // with 表达式指定上下文
  2. txt = `

{{ . }} {{ with “output” }} {{ . }} {{ else }} {{ . }} {{ end }}` tpl, _ = template.New(“tpl”).Parse(txt) tpl.Execute(os.Stdout, “txt”)

  1. // 使用内置函数
  2. txt = `

{{ . }} {{ printf “%T” . }} {{ .| printf “%T” }} {{ len . }} {{ .|len }} {{ html . }} {{ .|html }} {{ js . }} {{ .|js }}` tpl, _ = template.New(“tpl”).Parse(txt) tpl.Execute(os.Stdout, “

ligz
“)

  1. // 自定义函数
  2. txt = `

{{ . }} {{ upper . }} {{ .|lower }} ` funcs := template.FuncMap{ “upper”: strings.ToUpper, “lower”: strings.ToLower, } tpl, _ = template.New(“tpl”).Funcs(funcs).Parse(txt) tpl.Execute(os.Stdout, “abcdefgABCDEDA”)

  1. // 使用块指定默认值
  2. txt = `

content: {{ block “content” . }} {{ . }} {{ end }} overlay :={{ define “content” }} {{ . | len }}: {{ . }} {{ end }}` tpl, _ = template.New(“tpl”).Parse(txt) tpl.Execute(os.Stdout, “content”)

  1. tpl,_ = tpl.Parse(overlay)
  2. tpl.Execute(os.Stdout, "content")
  3. // 模板嵌入 使用模板
  4. txt = `

{{ define “head” }}

{{ end }}

{{ define “body” }}

{{ .Body }} {{ end }}

{{ define “html” }}

{{ template “head” . }} {{ template “body” . }} {{ end }}

{{ template “html” . }}` tpl, _ = template.New(“tpl”).Parse(txt) tpl.Execute(os.Stdout, struct{ Title string Body string }{ “网页Title”, “网页Body”, })

  1. // 指定解析模板
  2. // 指定模板
  3. txt = `

{{ define “head” }}

{{ end }}

{{ define “body” }}

{{ .Body }} {{ end }}

{{ define “html” }}

{{ template “head” . }} {{ template “body” . }} {{ end }} ` tpl, _ = template.New(“tpl”).Parse(txt) tpl.ExecuteTemplate(os.Stdout, “html”, struct { Title string Body string }{ “网页Title”, “网页Body”, })

  1. // 解析匹配的文件路径的模板文件
  2. // 使用匹配格式的文件中读取模板
  3. tpl = template.Must(template.New("tpl").Parse("tpls/*.html"))
  4. for _, t := range tpl.Templates(){
  5. fmt.Println(t.Name())
  6. }
  7. // 覆盖block块
  8. tpl.Parse(`{{ define "block" }} tpl block content {{ end }}`)
  9. tpl.ExecuteTemplate(os.Stdout, "layout.html", struct {
  10. Title string
  11. Body string
  12. }{
  13. "网页Title",
  14. "网页Body",
  15. })

}

  1. <a name="aFGu4"></a>
  2. ## learnTextTemplate_test.go
  3. ```go
  4. package learnTextTemp
  5. import "testing"
  6. func TestLearnTextTemp(t *testing.T) {
  7. LearnTextTemp()
  8. }

执行结果

  1. GOROOT=C:\Program Files\Go #gosetup
  2. GOPATH=C:\Users\ligz\go #gosetup
  3. "C:\Program Files\Go\bin\go.exe" test -c -o C:\Users\ligz\AppData\Local\Temp\GoLand\___basicproject_learnTextTemp__TestLearnTextTemp.test.exe basicproject/learnTextTemp #gosetup
  4. &lt;div&gt;ligz&lt;/div&gt;&lt;scripte&gt;alert(1);&lt;/script&gt;
  5. "C:\Program Files\Go\bin\go.exe" tool test2json -t C:\Users\ligz\AppData\Local\Temp\GoLand\___basicproject_learnTextTemp__TestLearnTextTemp.test.exe -test.v -test.paniconexit0 -test.run ^\QTestLearnTextTemp\E$ #gosetup
  6. === RUN TestLearnTextTemp
  7. &lt;div&gt;ligz&lt;/div&gt;&lt;scripte&gt;alert(1);&lt;/script&gt;
  8. \u003Cdiv\u003Eligz\u003C/div\u003E\u003Cscripte\u003Ealert(1);\u003C/script\u003E
  9. show var:
  10. ligz
  11. show slice:
  12. silence
  13. ligz
  14. show map:
  15. ligz
  16. 通州区
  17. if-else:
  18. True
  19. if-else:
  20. False
  21. if-elseif-else:
  22. WHITE
  23. if-elseif-else:
  24. unknow
  25. if-elseif-else:
  26. unknow
  27. range:
  28. white
  29. black
  30. red
  31. Title: 三年纪二班
  32. Students:
  33. 学号: 1
  34. 姓名: ligz
  35. 性别:
  36. Title: 三年级二班
  37. Students:
  38. 无学生信息
  39. Title:
  40. txt
  41. output
  42. &lt;div&gt;ligz&lt;/div&gt;&lt;script&gt;alert(1);&lt;/script&gt;
  43. string
  44. string
  45. 41
  46. 41
  47. 进程 已完成,退出代码为 1