ArcherWong博客
首页
博客
golang笔记---template模板语法
作者:ArcherWong
分类:golang
时间:2019-01-03 21:34:24
阅读:1259
[TOC] # 基本语法 - g使用 `{{` 和 `}}` 作为左右标签 - 使用 . 来访问当前位置的上下文 - 使用 $ 来引用当前模板根级的上下文 - 使用 $var 来访问创建的变量 # macaron 中控制器传递参数给模板 ``` type WebSite struct{ Title string Url string } type User map[string]string func portal(ctx *macaron.Context) { WebSite := WebSite{"百度","www.baidu.com"} user := User{} user["Name"] = "archer" user["Age"] = "18" pages := []struct { Num int }{{10}, {20}, {30}} ctx.Data["Name"] = name ctx.Data["User"] = user ctx.Data["WebSite"] = WebSite this.Data["Total"] = 100 ctx.Data["Pages"] = pages ctx.HTML(200, "portal") } ``` # 变量 ``` {{ .Name }} //我们有时候需要定义变量,比如我们需要定义一个article变量,同时将其初始化为”hello”,那么我们可以这样写: {{$article := "hello"}} //假设我们想要把传入值的内容赋值给article,则可以这样写: {{$article := .ArticleContent}} //获取到这个变量的内容 {{ $article }} ``` # 结构体 ``` {{.WebSite.Title}} {{.WebSite.Url}} ``` # map类型 ``` {{ .User.Name }} {{ .User.Age }} ``` # 遍历range 支持的类型为 array, slice, map, channel,对应的值长度为 0 时,range 不会执行 ``` //使用 .Num 输出子元素的 Num 属性,使用 $. 引用模板中的根级上下文 {{range .Pages}} {{.Num}} of {{$.Total}} {{end}} //使用创建的变量,在这里和 go 中的 range 用法是相同的。 {{range $index, $elem := .Pages}} {{$index}} - {{$elem.Num}} - {{.Num}} of {{$.Total}} {{end}} //range 也支持 else {{range .Pages}} {{else}} {{/* 当 .Pages 为空 或者 长度为 0 时会执行这里 */}} {{end}} ``` # 判断 当.condition为bool类型的时候,则为true表示执行,当.condition为string类型的时候,则非空表示执行。 ``` {{ if .Condition }} <h1>logged in</h1> {{ end }} ``` ``` {{ if not .Condition }} <h1>Not logged in</h1> {{ end }} ``` 支持else, else if ``` {{if .condition1}} {{else if .contition2}} {{end}} ``` 当进行逻辑判断的时候,需要一些内置模板函数 ``` //not 非 {{if not .condition}} {{end}} //and 与 {{if and .condition1 .condition2}} {{end}} //or 或 {{if or .condition1 .condition2}} {{end}} //eq 等于 {{if eq .var1 .var2}} {{end}} //ne 不等于 {{if ne .var1 .var2}} {{end}} //lt 小于 (less than) {{if lt .var1 .var2}} {{end}} //le 小于等于 {{if le .var1 .var2}} {{end}} //gt 大于 {{if gt .var1 .var2}} {{end}} //ge 大于等于 {{if ge .var1 .var2}} {{end}} ``` # with封装 with语言在Python中可以开启一个上下文环境。对于go模板,with语句类似,其含义就是创建一个封闭的作用域,在其范围内,可以使用.action,而与外面的.无关,只与with的参数有关: ``` {{ with arg }} 此时的点 . 就是arg {{ end }} ``` 也可以对变量赋值操作 ``` {{with $value := "My name is %s"}} {{printf . "slene"}} {{end}} ``` with 也支持 else ``` {{with pipeline}} {{else}} {{/* 当 pipeline 为空时会执行这里 */}} {{end}} ``` # 管道符 通过定义函数过滤器,实现模板的一些简单格式化处理。并且通过管道哲学,这样的处理方式可以连成一起。 ``` {{ p1 | p2 | p3 }} ``` 例如 模板内置了一些函数,比如格式化输出: ``` {{ 12.3456 | printf "%.2f" }} ``` # 函数 在 macaron中我们可以定义一个GetFirstChar方法,然后可以在模板中调用 ``` m := macaron.Classic() m.Use(macaron.Renderer(macaron.RenderOptions{ // 模板文件目录,默认为 "templates" Directory: "templates", // 模板文件后缀,默认为 [".tmpl", ".html"] Extensions: []string{".tmpl", ".html"}, // 模板函数,默认为 [] Funcs: []template.FuncMap{map[string]interface{}{ "AppName": func() string { return "Macaron" }, "GetFirstChar": func(str string) string { subStr := []rune(str) return string(subStr[0:1]) }, }}, // 模板语法分隔符,默认为 ["{{", "}}"] Delims: macaron.Delims{"{{", "}}"}, //... })) ``` 调用方法 ``` //可以直接调用,方法+参数 {{GetFirstChar "Archer"}} //也可以通过使用管道符的方式 {{"Archer"|GetFirstChar }} ``` # xss过滤 go模板会自动帮我们过滤 一些字符,以保障xss安全 如果我们想不转义,则可以使用下面方法 ``` ctx.Data["Title"] = template.HTML("<h1>这个标题不转义</h1>") ``` # 模板的嵌套 当模板想要引入子模板的时候,我们使用以下语句: ``` {{template "navbar"}} ``` 这样子就会尝试载入名称为navbar的子模板,同时我们也得定义一个子模板来实现”navbar”这个子模板。 子模板的定义为: ``` {{define "navbar"}} {{end}} ``` 在定义之间的内容将会覆盖`{{template “navbar”}}` 当然子模板是分离了,那么子模板能否获得父模板的变量呢?这是当然的,我们只需要使用 ``` {{template "navbar" .}} ``` 就可以将当前的变量传给子模板了,这个也是相当方便的。 # 参考: https://blog.csdn.net/huwh_/article/details/77140664 https://studygolang.com/articles/8023 https://www.jianshu.com/p/05671bab2357
标签:
上一篇:
golang笔记---golang发起get和post请求
下一篇:
golang笔记---关联数组(map)
文章分类
css
elasticsearch
git
golang
guacamole
javascript
letsencrypt
linux
nginx
other
php
python
vue
web
阅读排行
centos7.3配置guacamole
golang笔记---关联数组(map)
letsencrypt证书-管理工具certbot
golang笔记---template模板语法
nginx笔记-proxy_cache缓存详解
友情链接
node文件
laravel-vue
ArcherWong的博客园