前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go Template学习笔记

Go Template学习笔记

作者头像
李海彬
发布2018-03-19 10:04:23
6670
发布2018-03-19 10:04:23
举报
文章被收录于专栏:Golang语言社区Golang语言社区

快速开始

代码语言:javascript
复制
    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}} 当前对象的值,上下文

代码语言:javascript
复制
 //一个模板文件例子
    hello {{.UserName}}!
    {{range .Emails}}
        an email {{.}}
    {{end}}
    {{with .Friends}}
        {{range .}}
            my friend name is {{.Fname}}
        {{end}}
    {{end}}

{{if …}}{{else}}{{end}} go中的if-else语法类似,条件选择

代码语言:javascript
复制
 //if 后只能出现bool值,不支持bool表达式    
 if-else demo:
    {{if .ShowFlag}}
        section if    {{else}}
        section else.
    {{end}}

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

代码语言:javascript
复制
    //当前对象作为参数,传入内置函数html中
    {{. | html}}

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

代码语言:javascript
复制
  {{with $x := "output"}}{{$x}}{{end}}
    {{with $x := "output"}}{{$x | printf "%s"}}{{end}}

输出

代码语言:javascript
复制
outputoutput

模板函数 支持的函数类型

代码语言:javascript
复制
func(args ...interface{})string

函数定义例子

代码语言:javascript
复制
    func Say(args ...interface{})string{        
    return fmt.Sprintf("%s %v","Hello",args[0])
    }

注册函数

代码语言:javascript
复制
t = t.Funcs(template.FuncMap{"Say":Say})

模板定义

代码语言:javascript
复制
    {{Say `Func`}}
    {{`Pipe` | Say}}

输出:

代码语言:javascript
复制
Hello FuncHello Pipe

template中内置函数

代码语言:javascript
复制
 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操作 检测模板是否正确:大括号是否匹配,注释是否正确关闭,变量是否正确

代码语言:javascript
复制
 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 }"))

输出:

代码语言:javascript
复制
  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三个子模块

代码语言:javascript
复制
 //声明
    {{define "module_name"}}content{{end}}
    //调用
    {{template "module_name"}}

以下定义三个文件:

  • header.html
代码语言:javascript
复制
    {{define "header"}}
    <html>
    <head>
        <title>演示信息</title>
    </head>
    <body>
    {{end}}

footer.tmpl

代码语言:javascript
复制
 {{define "footer"}}
    </body>
    </html>
    {{end}}

content.tmpl

代码语言:javascript
复制
    {{define "content"}}
    {{template "header"}}
     <h1>演示嵌套</h1>
    <ul>
        <li>嵌套使用define定义子模板</li>
        <li>调用使用template</li>
    </ul>
    {{template "footer"}}
    {{end}}

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

代码语言:javascript
复制
s1,_ := template.ParseFiles("header.tmpl","content.tmpl","footer.tmpl")
s1.ExecuteTemplate(w, "header",nil)
s1.ExecuteTemplate(w, "footer", nil)
s1.ExecuteTemplate(w, "content", nil)
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-02-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Golang语言社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档