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(“
// 显示数据
// 显示信息
txt := `show var:
{{.}}` tpl, _ := template.New(“tpl”).Parse(txt) tpl.Execute(os.Stdout, “ligz”)
fmt.Println()
// 显示切片元素
txt = `show slice:
{{ index . 0 }} {{ index . 1 }} ` tpl, _ = template.New(“tpl”).Parse(txt) tpl.Execute(os.Stdout, []string{“silence”, “ligz”})
fmt.Println()
// 显示映射元素
txt = `show map:
{{ .name }} {{ .addr }} ` tpl, _ = template.New(“tpl”).Parse(txt) tpl.Execute(os.Stdout, map[string]string{“name”: “ligz”, “addr”: “通州区”})
// 条件表达式
// if else 表达式
txt = `if-else:
{{ if . }} True {{ else }} False {{ end }}` tpl, _ = template.New(“tpl”).Parse(txt) tpl.Execute(os.Stdout, true) tpl.Execute(os.Stdout, false)
// if else-if else 表达式
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”)
// range 表达式
txt = `range:
{{ range . }} {{ . }} {{ end }}` tpl, _ = template.New(“tpl”).Parse(txt) tpl.Execute(os.Stdout, []string{“white”, “black”, “red”})
// 属性显示、 if-else 表达式
txt = `
Title: {{ .Title }} Students: {{ range .Students }} 学号: {{ .ID}} 姓名: {{ .Name }} 性别: {{ if .Gender }} 男 {{ else }} 女 {{ end }} {{ else }} 无学生信息 {{ end }}` type Student struct { ID int Name string Gender bool }
type Classs struct {
Title string
Students []Student
}
tpl, _ = template.New("tpl").Parse(txt)
tpl.Execute(os.Stdout, Classs{
Title: "三年纪二班",
Students: []Student{
{ID:1, Name: "ligz", Gender: true},
},
})
tpl.Execute(os.Stdout, Classs{
Title: "三年级二班",
Students: []Student{},
})
// range 表达式
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)
// with 表达式指定上下文
txt = `
{{ . }} {{ with “output” }} {{ . }} {{ else }} {{ . }} {{ end }}` tpl, _ = template.New(“tpl”).Parse(txt) tpl.Execute(os.Stdout, “txt”)
// 使用内置函数
txt = `
{{ . }} {{ printf “%T” . }} {{ .| printf “%T” }} {{ len . }} {{ .|len }} {{ html . }} {{ .|html }} {{ js . }} {{ .|js }}` tpl, _ = template.New(“tpl”).Parse(txt) tpl.Execute(os.Stdout, “
// 自定义函数
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”)
// 使用块指定默认值
txt = `
content: {{ block “content” . }} {{ . }} {{ end }}
overlay :=
{{ define “content” }} {{ . | len }}: {{ . }} {{ end }}`
tpl, _ = template.New(“tpl”).Parse(txt)
tpl.Execute(os.Stdout, “content”)
tpl,_ = tpl.Parse(overlay)
tpl.Execute(os.Stdout, "content")
// 模板嵌入 使用模板
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”, })
// 指定解析模板
// 指定模板
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”, })
// 解析匹配的文件路径的模板文件
// 使用匹配格式的文件中读取模板
tpl = template.Must(template.New("tpl").Parse("tpls/*.html"))
for _, t := range tpl.Templates(){
fmt.Println(t.Name())
}
// 覆盖block块
tpl.Parse(`{{ define "block" }} tpl block content {{ end }}`)
tpl.ExecuteTemplate(os.Stdout, "layout.html", struct {
Title string
Body string
}{
"网页Title",
"网页Body",
})
}
<a name="aFGu4"></a>
## learnTextTemplate_test.go
```go
package learnTextTemp
import "testing"
func TestLearnTextTemp(t *testing.T) {
LearnTextTemp()
}
执行结果
GOROOT=C:\Program Files\Go #gosetup
GOPATH=C:\Users\ligz\go #gosetup
"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
<div>ligz</div><scripte>alert(1);</script>
"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
=== RUN TestLearnTextTemp
<div>ligz</div><scripte>alert(1);</script>
\u003Cdiv\u003Eligz\u003C/div\u003E\u003Cscripte\u003Ealert(1);\u003C/script\u003E
show var:
ligz
show slice:
silence
ligz
show map:
ligz
通州区
if-else:
True
if-else:
False
if-elseif-else:
WHITE
if-elseif-else:
unknow
if-elseif-else:
unknow
range:
white
black
red
Title: 三年纪二班
Students:
学号: 1
姓名: ligz
性别: 男
Title: 三年级二班
Students:
无学生信息
Title:
女
txt
output
<div>ligz</div><script>alert(1);</script>
string
string
41
41
进程 已完成,退出代码为 1