go常用包——template

内容

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。