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 stringStudents []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 stringBody string}{"网页Title","网页Body",})
}
<a name="aFGu4"></a>## learnTextTemplate_test.go```gopackage learnTextTempimport "testing"func TestLearnTextTemp(t *testing.T) {LearnTextTemp()}
执行结果
GOROOT=C:\Program Files\Go #gosetupGOPATH=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\u003Eshow var:ligzshow slice:silenceligzshow map:ligz通州区if-else:Trueif-else:Falseif-elseif-else:WHITEif-elseif-else:unknowif-elseif-else:unknowrange:whiteblackredTitle: 三年纪二班Students:学号: 1姓名: ligz性别: 男Title: 三年级二班Students:无学生信息Title:女txtoutput<div>ligz</div><script>alert(1);</script>stringstring4141进程 已完成,退出代码为 1
