内容
1 模板基本用法
2 模板进阶用法
--定义变量 --条件判断 --循环 -- with语句
3 模板高级用法
--作用域 --管道 --模板方法 --从本地加载文件
模板基本使用
1 基本渲染
// 通过简单类型渲染模板
func TestTemplate() {
http.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) {
// 定义一个名为test模板对象 并且解析模板内容
tmpl, err := template.New("test").Parse("value is {{.val}}")
if err != nil {
fmt.Fprintf(writer, "err: %v", err)
return
}
// 获取key val的参数 ?val="value"
val := request.URL.Query().Get("val")
// 进行渲染
err = tmpl.Execute(writer, val)
if err != nil {
fmt.Fprintf(writer, "err: %v", err)
}
})
log.Infof("start http server....")
http.ListenAndServe("localhost:8080", nil)
}
// 通过对象渲染模板
/*
1 New方法定义模板
2 Pares传入模板
3 定义渲染对象,字段名名字和模板{{}}变量一致
*/
func TestTemplate2() {
tmpl, err := template.New("test").Parse(`Student
Name: {{.Name}},
Age: {{.Age}}
`)
if err != nil {
fmt.Println(err)
}
student := struct {
Name string
Age int
}{"二狗子",22}
b := strings.Builder{}
tmpl.Execute(&b, student)
fmt.Println(b.String())
}
// 通过map渲染模板
/*
1 New方法定义模板
2 Pares传入模板
3 定义渲染map,map key名字和模板{{}}变量一致
*/
func TestTemplate3(){
tmpl, err := template.New("test").Parse(`Student
Name: {{.Name}},
Age: {{.Age}}
`)
if err != nil {
fmt.Println(err)
}
student := map[string]string{
"Name": "李狗子",
"Age": "23",
}
b := strings.Builder{}
tmpl.Execute(&b, student)
fmt.Println(b.String())
}
2 调用方法
调用方法渲染和上面类似
type Mytype int
func (m *Mytype) Add() int {
return 2+3
}
func TestTemplate4(){
tmpl, err := template.New("test").Parse(`Student
Add: {{.Add}}
`)
if err != nil {
fmt.Println(err)
}
m := new(Mytype)
b := strings.Builder{}
tmpl.Execute(&b, m)
fmt.Println(b.String())
}
模板进阶使用
1 模板中定义变量
1 使用$加变量名定义一个变量, 变量的定义(或首次获得赋值)必须使用 := 的语法
2 获取变量值时,直接在相应位置使用美元符号加上变量名称即可。
3 所有有关变量的操作都属于模板语法的一部分,因此需要使用双层大括号将其包裹起来。
4 修改变量只需要和程序代码中那样,直接使用等号(=)即可。
func TestTemplate5() {
tmpl, err := template.New("test").Parse(`
{{$name := "二狗子"}}
{{$age := 22}}
Name: {{$name}}
Age: {{$age}}
{{$name = "李二狗子"}}
`)
if err != nil {
fmt.Println(err)
}
b := strings.Builder{}
tmpl.Execute(&b, nil)
fmt.Println(b.String())
}
2模板中使用条件判断、循环
if判断, 格式:{{if }} {{else}} {{end}}
func TestTemplate6() {
tmpl, err := template.New("test").Parse(`
{{if .val}}
val is true
{{else}}
val is false
{{end}}
`)
if err != nil {
fmt.Println(err)
}
b := strings.Builder{}
tmpl.Execute(&b, map[string]interface{}{
"val": false,
})
fmt.Println(b.String())
}
使用循环
格式:
{{range $variable := .Values}}
{{end}}
func TestTemplate7() {
tmpl, err := template.New("test").Parse(`
{{range $name := .names}}
name: {{$name}}
{{end}}
`)
if err != nil {
fmt.Println(err)
}
b := strings.Builder{}
tmpl.Execute(&b, map[string]interface{}{
"names": []string{"zhangsan", "lisi", "wanger"},
})
fmt.Println(b.String())
}
模板高级用法
通过Funcs方法添加模板方法
func TestTemplate8() {
tmpl,err := template.New("test").Funcs(template.FuncMap{
"add": func(a, b int) int{
return a+b
},
}).Parse(`
result: {{add 1 2}}
`)
if err != nil {
fmt.Println(err)
}
b := strings.Builder{}
tmpl.Execute(&b, nil)
fmt.Println(b.String())
}
更多详细使用说明:
https://github.com/unknwon/building-web-applications-in-go/blob/master/articles/03.md