go-模板引擎

动作

Go 模板的动作就是一些嵌入到模板里面的命令,这些命令在模板中需要放到两个

大括号里{{ 动作 }},之前我们已经用过一个很重要的动作:点(.),它代表了传递给模

板的数据。下面我们再介绍几个常用的动作,如果还想了解其他类型的动作,可以参考

text/template 库的文档。

条件动作

格式一:

{{ if arg}} 要显示的内容 {{ end }}

格式二:

{{ if arg}} 要显示的内容 {{else}} 当 if 条件不满足时要显示的内容 {{ end }}

其中的 arg 是传递给条件动作的参数,该值可以是一个字符串常量、

一个变量、一个返回单个值的函数获取方法等。

例如

模板文件

<html>
<head>
<title>模板文件</title>
<meta charset="utf-8" />
</head>
<body>
<!-- 嵌入动作 -->
{{if .}} 你已经成年了! {{else}} 你还未成年 {{end}}
</body>
</html>

处理器端代码

func handler(w http.ResponseWriter, r *http.Request) {
//解析模板文件
t := template.Must(template.ParseFiles("hello.html"))
//声明一个变量
age := 16
//执行模板
t.Execute(w, age > 18)
}

浏览器中的结果

你还未成年

迭代动作

迭代动作可以对数组、切片、映射或者通道进行迭代。

格式一:

{{range . }} 遍历到的元素是 {{ . }} {{ end }}

格式二:

{{range . }} 遍历到的元素是 {{ . }} {{ else }} 没有任何元素 {{ end }}

range 后面的点代表被遍历的元素;要显示的内容里面的点代表遍历

到的元素

例如:

模板文件

<html>
<head>
<title>模板文件</title>
<meta charset="utf-8" />
</head>
<body>
<!-- 嵌入动作 -->
{{range .}}
<a href="#">{{.}}</a>
{{else}} 没有遍历到任何内容 {{end}}
</body>
</html>

处理器端代码

func handler(w http.ResponseWriter, r *http.Request) {
//解析模板文件
t := template.Must(template.ParseFiles("hello.html"))
//声明一个字符串切片
stars := []string{"马蓉", "李小璐", "白百何"}
//执行模板
t.Execute(w, stars)
}

浏览器中的结果

马蓉 李小璐 白百何

如果迭代之后是一个个的结构体,获取结构体中的字段值使用 .字段名

方式获取

{{range . }} 获取结构体的 Name 字段名 {{ .Name }} {{ end }} 迭代 Map
时可以设置变量,变量以$开头: {{ range $k , $v := . }} 键是 {{ $k }} , 值是 {{
$v }} {{ end }} 迭代管道 {{ c1 | c2 | c3 }}

c1、c2 和 c3 可以是参数或者函数。管道允许用户将一个参数的输出

传递给下一个参数,各个参数之间使用 | 分割。

设置动作

设置动作允许在指定的范围内对点(.)设置值。

格式一:

{{ with arg }} 为传过来的数据设置的新值是{{ . }} {{ end }}

格式二:

{{ with arg }} 为传过来的数据设置的新值是{{ . }} {{ else }} 传过来的数据仍然是{{
. }} {{ end }}

例如:

模板文件

<html>
<head>
<title>模板文件</title>
<meta charset="utf-8" />
</head>
<body>
<!-- 嵌入动作 -->
<div>得到的数据是:{{.}}</div>
{{with "太子"}}
<div>替换之后的数据是:{{.}}</div>
{{end}}
<hr />
{{with ""}}
<div>看一下现在的数据是:{{.}}</div>
{{else}}
<div>数据没有被替换,还是:{{.}}</div>
{{end}}
</body>
</html>

处理器端代码

func handler(w http.ResponseWriter, r *http.Request) {
//解析模板文件
t := template.Must(template.ParseFiles("hello.html"))
//执行模板
t.Execute(w, "狸猫")
}

浏览器中的结果

得到的数据是:狸猫
替换之后的数据是:太子
数据没有被替换,还是:狸猫

包含动作

包含动作允许用户在一个模板里面包含另一个模板,从而构建出嵌套的模

板。

格式一:{{ template “name” }}

name 为被包含的模板的名字

格式二:{{ template “name” arg }}

arg 是用户想要传递给被嵌套模板的数据

例如:

模板文件

hello.html

<html>
<head>
<title>模板文件</title>
<meta charset="utf-8" />
</head>
<body>
<!-- 嵌入动作 -->
<div>从后台得到的数据是:{{.}}</div>
<!-- 包含 hello2.html 模板 -->
{{ template "hello2.html"}}
<div>hello.html 文件内容结束</div>
<hr />
<div>将 hello.html 模板文件中的数据传递给 hello2.html 模板文件</div>
{{ template "hello2.html" . }}
</body>
</html>

hello2.html

<html>
<head>
<title>hello2 模板文件</title>
<meta charset="utf-8" />
</head>
<body>
<!-- 嵌入动作 -->
<div>hello2.html 模板文件中的数据是:{{.}}</div>
</body>
</html>

处理器端代码

func handler(w http.ResponseWriter, r *http.Request) {
//解析模板文件
t := template.Must(template.ParseFiles("hello.html", "hello2.html"))
//执行模板
t.Execute(w, "测试包含")
}

注意:在解析模板文件时,当前文件以及被包含的文件都要解析

浏览器中的结果

从后台得到的数据是:测试包含
hello2.html 模板文件中的数据是:
hello.html 文件内容结束
将 hello.html 模板文件中的数据传递给 hello2.html 模板文件
hello2.html 模板文件中的数据是:测试包含

定义动作

当我们访问一些网站时,经常会看到好多网页中有相同的部分:比如导航栏、版权

信息、联系方式等。这些相同的布局我们可以通过定义动作在模板文件中定义模板来实

现。定义模板的格式是:以{{ define “layout” }}开头,以{{ end }}结尾。

  1. 在一个模板文件(hello.html)中定义一个模板
<!-- 定义模板 -->
{{ define "model"}}
<html>
<head>
<title>模板文件</title>
<meta charset="utf-8" />
</head>
<body>
{{ template "content"}}
</body>
</html>
{{ end }}
  1. 在一个模板文件中定义多个模板

    模板文件(hello.html)
<!-- 定义模板 -->
{{ define "model"}}
<html>
<head>
<title>模板文件</title>
<meta charset="utf-8" />
</head>
<body>
{{ template "content"}}
</body>
</html>
{{ end }} {{ define "content"}}
<a href="#">点我有惊喜</a>
{{ end }}

处理器端代码

func handler(w http.ResponseWriter, r *http.Request) {
//解析模板文件
t := template.Must(template.ParseFiles("hello.html")) //执行模板
t.ExecuteTemplate(w, "model", "")
}

注意:需要调用 ExecuteTemplate 方法并指定模板的名字

浏览器中的结果

点我有惊喜

  1. 在不同的模板文件中定义同名的模板

    模板文件

    hello.html
<!-- 定义模板 -->
{{ define "model"}}
<html>
<head>
<title>模板文件</title>
<meta charset="utf-8" />
</head>
<body>
{{ template "content"}}
</body>
</html>
{{ end }}

content1.html

<html>
<head>
<title>content 模板文件</title>
<meta charset="utf-8" />
</head>
<body>
<!-- 定义 content 模板 -->
{{ define “content” }}
<h1>我是 content1.html 模板文件中的内容</h1>
{{ end }}
</body>
</html>

content2.html

<html>
<head>
<title>content 模板文件</title>
<meta charset="utf-8" />
</head>
<body>
<!-- 定义 content 模板 -->
{{ define “content” }}
<h1>我是 content2.html 模板文件中的内容</h1>
{{ end }}
</body>
</html>

处理器端代码

func handler(w http.ResponseWriter, r *http.Request) {
rand.Seed(time.Now().Unix())
var t *template.Template
if rand.Intn(5) > 2 {
//解析模板文件
t = template.Must(template.ParseFiles("hello.html",
"content1.html")) } else {
//解析模板文件
t = template.Must(template.ParseFiles("hello.html",
"content2.html"))
}
//执行模板
t.ExecuteTemplate(w, "model", "")
}

浏览器中的结果

我是 content1.html 模板文件中的内容

块动作

Go 1.6 引入了一个新的块动作,这个动作允许用户定义一个模板并立即使用。相当

于设置了一个默认的模板

格式:

{{ block arg }} 如果找不到模板我就要显示了 {{ end }}

修改 6.4.5 中的模板文件 hello.html

<!-- 定义模板 -->
{{ define "model"}}
<html>
<head>
<title>模板文件</title>
<meta charset="utf-8" />
</head> <body>
{{ block "content" .}} 如果找不到就显示我 {{ end }}
</body>
</html>
{{ end }}

稍微修改一下处理器端的代码

func handler(w http.ResponseWriter, r *http.Request) {
rand.Seed(time.Now().Unix())
var t *template.Template
if rand.Intn(5) > 2 {
//解析模板文件
t = template.Must(template.ParseFiles("hello.html",
"content1.html"))
} else {
//解析模板文件
t = template.Must(template.ParseFiles("hello.html"))
}
//执行模板
t.ExecuteTemplate(w, "model", "")
}

浏览器中的结果

如果找不到就显示我

goweb-动作的更多相关文章

  1. 浅谈JSP中include指令与include动作标识的区别

    JSP中主要包含三大指令,分别是page,include,taglib.本篇主要提及include指令. include指令使用格式:<%@ include file="文件的绝对路径 ...

  2. Jsp的九大对象,七大动作,三大指令

    jsp九大内置对象:1>out 向客户端输出数据,字节流.如out.print(" dgaweyr"); 2>request 接收客户端的http请求.String g ...

  3. 基于CkEditor实现.net在线开发之路(7)列表页面开发动作介绍

    一个列表页面不止是查询,它也包含了很多业务上功能的实现,这些业务功能的实现的逻辑我称之为动作.如触发单击按钮删除数据,更改业务表数据,调用webService,调用WCF接口,弹出新窗体新增.修改.查 ...

  4. iOS系列 基础篇 07 Action动作和输出口

    iOS系列 基础篇 07 Action动作和输出口 目录:  1. 前言及案例说明 2. 什么是动作? 3. 什么是输出口? 4. 实战 5. 结尾 1. 前言及案例说明 上篇内容我们学习了标签和按钮 ...

  5. JSP动作元素——————理论篇

    JSP动作元素的组成及作用 JSP使用Action来控制Servlet引擎的行为,可重复使用JavaBean组件. 常用Action: jsp:param       在 jsp:include.js ...

  6. JSP中编译指令include与动作指令include的区别

    include指令是编译阶段的指令,即include所包含的文件的内容是编译的时候插入到JSP文件中,JSP引擎在判断JSP页面未被修改, 否则视为已被修改.由于被包含的文件是在编译时才插入的,因此如 ...

  7. 在MotionBuilder中绑定C3D动作和模型

    [题外话] 实验室人手不足,虽然自己连MotionBuilder一点都没有用过,但是老板叫自己干也只能硬着头皮上了.本文详细介绍了MotionBuilder 2013中的摄像机操作以及在MotionB ...

  8. 重温JSP学习笔记--JSP动作标签

    上一篇笔记写的是jsp的三个指令九个内置对象,这篇随笔开始写jsp的动作标签,动作标签是由服务器(Tomcat)来解释执行,与java代码一样,都是在服务器端执行的,jsp动作标签有十几多个,这里只写 ...

  9. javabean和jsp动作元素

    model1就是利用了jsp和javabean 的组合来处理问题.jsp页面如果有太多的逻辑代码的话,维护起来和扩展起来是相当的麻烦的.所以jsp的逻辑代码部分都打包到一种java类当中进行编写.这种 ...

  10. 创建ASP.NET Core MVC应用程序(4)-添加CRUD动作方法和视图

    创建ASP.NET Core MVC应用程序(4)-添加CRUD动作方法和视图 创建CRUD动作方法及视图 参照VS自带的基架(Scaffold)系统-MVC Controller with view ...

随机推荐

  1. cf 500 D. New Year Santa Network

    直接按边分,2个点在边的一边,1个在另一边,组合出来就是这个边对答案的贡献,权值换了就再重新算个数而已. #include <bits/stdc++.h> #define LL long ...

  2. bzoj 1369: [Baltic2003]Gem

    确实是神2333333333,一开始以为是01染色sb题,然而被打脸... (蒟蒻不乱说,网上各种神犇的题解,还有图!!) #include <bits/stdc++.h> #define ...

  3. 二十三、JavaScript之html事件

    一.代码如下 二.效果如下 三.点击之后 <!DOCTYPE html> <html> <meta http-equiv="Content-Type" ...

  4. 九十四、SAP中ALV事件之八,显示功能按钮栏

    一.我们把其他代码都注释掉,直接写一行调用 SET PF-STATUS 'TIANPAN_TOOLS'. 二.运行程序,会看到我们上一篇所添加的相关功能栏图标, 三.点击不同图标,会按程序代码,有不同 ...

  5. 八十八、SAP中ALV事件之二,事件的定义和事件子例程

    一.我们来到SE37,找到REUSE_ALV_EVENTS_GET相关的定义 二.我们需要用到下面这3个事件 三.我们添加一个第五步,并把显示ALV座位第六步.在第五步中定义三个事件 四.在末尾,添加 ...

  6. 字符串匹配之KMP

    说明 KMP算法看懂了觉得特别简单,思路很简单,看不懂之前,查各种资料,看的稀里糊涂,即使网上最简单的解释,依然看的稀里糊涂. 我花了半天时间,争取用最短的篇幅大致搞明白这玩意到底是啥. 这里不扯概念 ...

  7. Python爬虫实战(一) 使用urllib库爬取拉勾网数据

    本笔记写于2020年2月4日.Python版本为3.7.4,编辑器是VS code 主要参考资料有: B站视频av44518113 Python官方文档 PS:如果笔记中有任何错误,欢迎在评论中指出, ...

  8. WebSocket在建立连接时通过@PathParam获取页面传值

    最近用Java下使用WebSocket,有一个需求,在页面与Java后台建立连接的时候获取页面上提供的参数,也就是在@OnOpen注解的方法里面获取一次页面的参数,有一个很简单的方法可以获得.即使用@ ...

  9. n以内的素数

    /* 问题描述: 质数又称素数.一个大于1的自然数,除了1和它自身外, 不能被其他自然数整除的数叫做质数: 问题分析: 素数只能被1和自身整除的数.判断一个数是不是素数, 是用2和这个数之间的所有的数 ...

  10. 第一章,初识C语言

    1.1 C语言起源 1.2 选择C语言的理由 1.3 C语言的应用范围 1.4 计算机能做什么 1.5 高级计算机语言和编译器 1.6 语言标准 c90,c99,c11. 1.7 使用C语言的7个步骤 ...