Go Template学习笔记

快速开始

    func handler(w http.ResponseWriter,r *http.Request){
        t := template.New("new template") //创建一个模板
        t,err := t.ParseFile("tpl/welcome.html",nil) //解析模板文件
        if err != nil{
            panic(err.Error())
        }
        user := GetUser() //获取用户信息
        t.Execute(w,user)    //执行模板,并通过w输出
    }

各种模板

  • {{.}} 表示当前对象,如user对象
  • {{.FieldName}} 表示对象的某个字段
  • {{range …}}{{end}} go中for…range语法类似,循环
  • {{with …}}{{end}} 当前对象的值,上下文
 //一个模板文件例子
    hello {{.UserName}}!
    {{range .Emails}}
        an email {{.}}
    {{end}}
    {{with .Friends}}
        {{range .}}
            my friend name is {{.Fname}}
        {{end}}
    {{end}}
  • {{if …}}{{else}}{{end}} go中的if-else语法类似,条件选择
 //if 后只能出现bool值,不支持bool表达式
    if-else demo:
    {{if .ShowFlag}}
        section if
    {{else}}
        section else.
    {{end}}

pipeline
左边的输出作为右边的输入

    //当前对象作为参数,传入内置函数html中
    {{. | html}}

模板变量
模板使用过程中定义局部变量

  {{with $x := "output"}}{{$x}}{{end}}
    {{with $x := "output"}}{{$x | printf "%s"}}{{end}}

输出

output
output

模板函数
支持的函数类型

func(args ...interface{})string

函数定义例子

    func Say(args ...interface{})string{
        return fmt.Sprintf("%s %v","Hello",args[0])
    }

注册函数

t = t.Funcs(template.FuncMap{"Say":Say})

模板定义

    {{Say `Func`}}
    {{`Pipe` | Say}}

输出:

Hello Func
Hello Pipe

template中内置函数

 var builtins = FuncMap{
        "and":      and,
        "call":     call,
        "html":     HTMLEscaper,
        "index":    index,
        "js":       JSEscaper,
        "len":      length,
        "not":      not,
        "or":       or,
        "print":    fmt.Sprint,
        "printf":   fmt.Sprintf,
        "println":  fmt.Sprintln,
        "urlquery": URLQueryEscaper,
    }

Must操作
检测模板是否正确:大括号是否匹配,注释是否正确关闭,变量是否正确

 tOk := template.New("first")
        template.Must(tOk.Parse(" some static text /* and a comment */"))
        fmt.Println("The first one parsed OK.")

        template.Must(template.New("second").Parse("some static text {{ .Name }}"))
        fmt.Println("The second one parsed OK.")

        fmt.Println("The next one ought to fail.")
        tErr := template.New("check parse error with Must")
        template.Must(tErr.Parse(" some static text {{ .Name }"))

输出:

  The first one parsed OK.
    The second one parsed OK.
    The next one ought to fail.
    panic: template: check parse error with Must:1: unexpected "}" in command

模板嵌套
将模板模块化,如在web开发中定义header,content,footer三个子模块

 //声明
    {{define "module_name"}}content{{end}}
    //调用
    {{template "module_name"}}

以下定义三个文件:

  • header.html
   {{define "header"}}
   <html>
   <head>
       <title>演示信息</title>
   </head>
   <body>
   {{end}}
  • footer.tmpl
 {{define "footer"}}
    </body>
    </html>
    {{end}}
  • content.tmpl
    {{define "content"}}
    {{template "header"}}
     <h1>演示嵌套</h1>
    <ul>
        <li>嵌套使用define定义子模板</li>
        <li>调用使用template</li>
    </ul>
    {{template "footer"}}
    {{end}}

go代码
ParseFiles:所有嵌套的模板全部解析到模板中

s1,_ := template.ParseFiles("header.tmpl","content.tmpl","footer.tmpl")
s1.ExecuteTemplate(w, "header",nil)
s1.ExecuteTemplate(w, "footer", nil)
s1.ExecuteTemplate(w, "content", nil)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值