模板引擎

Go 为我们提供了 text/template 库和 html/template 库这两个模板引擎,模板引

擎通过将数据和模板组合在一起生成最终的 HTML,而处理器负责调用模板引擎并将引

擎生成的 HTMl 返回给客户端。

Go 的模板都是文本文档(其中 Web 应用的模板通常都是 HTML),它们都嵌入了

一些称为动作的指令。从模板引擎的角度来说,模板就是嵌入了动作的文本(这些文本

通常包含在模板文件里面),而模板引擎则通过分析并执行这些文本来生成出另外一些

文本。

HelloWorld

使用 Go 的 Web 模板引擎需要以下两个步骤:

(1) 对文本格式的模板源进行语法分析,创建一个经过语法分析的模板结构,其中

模板源既可以是一个字符串,也可以是模板文件中包含的内容。

(2 )执行经过语法分析的模板,将 ResponseWriter 和模板所需的动态数据传递给模

板引擎,被调用的模板引擎会把经过语法分析的模板和传入的数据结合起来,生成出最

终的 HTML,并将这些 HTML 传递给 ResponseWriter。

下面就让我们写一个简单的 HelloWorld

  1. 创建模板文件 hello.html
<html>
<head>
<title>模板文件</title>
<meta charset="utf-8" />
</head>
<body>
//嵌入动作 {{.}}
</body>
</html>
  1. 在处理器中触发模板引擎
func handler(w http.ResponseWriter, r *http.Request) {
//解析模板文件
t, _ := template.ParseFiles("hello.html")
//执行模板
t.Execute(w, "Hello World!")
}
  1. 浏览器中的结果

    Hello World!

解析模板

  1. ParseFiles 函数

当我们调用 ParseFiles 函数解析模板文件时,Go 会创建一个新的模板,

并将给定的模板文件的名字作为新模板的名字,如果该函数中传入了多个

文件名,那么也只会返回一个模板,而且以第一个文件的文件名作为模板

的名字,至于其他文件对应的模板则会被放到一个 map 中。让我们再来

看一下 HelloWorld 中的代码:

t, _ := template.ParseFiles("hello.html")

以上代码相当于调用 New 函数创建一个新模板,然后再调用 template 的

ParseFiles 方法:

t := template.New("hello.html")
t, _ = t.ParseFiles("hello.html")

我们在解析模板时都没有对错误进行处理,Go 提供了一个 Must 函数专

门用来处理这个错误。Must 函数可以包裹起一个函数,被包裹的函数会

返回一个指向模板的指针和一个错误,如果错误不是 nil,那么 Must 函数

将产生一个 panic。

实验 Must 函数之后的代码

t := template.Must(template.ParseFiles("hello.html"))

  1. ParseGlob 函数

通过该函数可以通过指定一个规则一次性传入多个模板文件,如:

t, _ := template.ParseGlob("*.html")

执行模板

  1. 通过 Execute 方法

如果只有一个模板文件,调用这个方法总是可行的;但是如果有多个模板

文件,调用这个方法只能得到第一个模板

  1. 通过 ExecuteTemplate 方法

例如:

t, _ := template.ParseFiles("hello.html", "hello2.html")

变量 t 就是一个包含了两个模板的模板集合,第一个模板的名字是

hello.html,第二个模板的名字是 hello2.html,如果直接调用 Execute 方法,

则只有模板 hello.html 会被执行,如何想要执行模板 hello2.html,则需要

调用 ExecuteTemplate 方法

t.ExecuteTemplate(w, "hello2.html", "我要在 hello2.html 中显示")

goweb-模板引擎的更多相关文章

  1. JavaScript学习笔记(一)——延迟对象、跨域、模板引擎、弹出层、AJAX示例

    一.AJAX示例 AJAX全称为“Asynchronous JavaScript And XML”(异步JavaScript和XML) 是指一种创建交互式网页应用的开发技术.改善用户体验,实现无刷新效 ...

  2. Handlebars 模板引擎之前后端用法

    前言 不知不觉间,居然已经这么久没有写博客了,坚持还真是世界上最难的事情啊. 不过我最近也没闲着,辞工换工.恋爱失恋.深圳北京都经历了一番,这有起有落的生活实在是太刺激了,就如拿着两把菜刀剁洋葱一样, ...

  3. 推荐13款javascript模板引擎

    javaScript 在生成各种页面内容时如果能结合一些模板技术,可以让逻辑和数据之间更加清晰,本文介绍 X 款 JavaScript 的模板引擎.(排名不分先后顺序) 1. Mustache 基于j ...

  4. JavaScript学习总结(一)——延迟对象、跨域、模板引擎、弹出层、AJAX示例

    一.AJAX示例 AJAX全称为“Asynchronous JavaScript And XML”(异步JavaScript和XML) 是指一种创建交互式网页应用的开发技术.改善用户体验,实现无刷新效 ...

  5. DotLiquid模板引擎简介

    DotLiquid是一个在.Net Framework上运行的模板引擎,采用Ruby的Liquid语法,这个语法广泛的用在Ruby on rails和Django等网页框架中. DotLiquid相比 ...

  6. doT js 模板引擎【初探】要优雅不要污

    js中拼接html,总是感觉不够优雅,本着要优雅不要污,决定尝试js模板引擎. JavaScript 模板引擎 JavaScript 模板引擎作为数据与界面分离工作中最重要一环,越来越受开发者关注. ...

  7. 浅谈 Web 中前后端模板引擎的使用

    前言 这篇文章本来不打算写的,实话说楼主对前端模板的认识还处在非常初级的阶段,但是为了整个 源码解读系列 的完整性,在深入 Underscore _.template 方法源码后,觉得还是有必要记下此 ...

  8. JavaScript模板引擎artTemplate.js——结语

    再次首先感谢模板的作者大神,再次放出github的地址:artTemplate性能卓越的js模板引擎 然后感谢博客园的一位前辈,他写的handlebars.js模板引擎教程,对我提供了很大的帮助,也是 ...

  9. Javascript最简单的模板引擎

    非常简单,性能估计一般,方法最原始. //第一代模板引擎 //只支持{{key}}的替换,不支持语句 //支持Object和Array对象 function template_setdata(temp ...

  10. Javascript模板引擎插件收集

    为什么要用JS的模板引擎,打个比方,如果你要通过接口绑定数据,最终要加进去DOM中,我们普遍的做法就是不断的+,最终append进去,但是这样的做法就是后续人员压根就没法维护.所以这时模板引擎出来了. ...

随机推荐

  1. 采用idea创建springboot mybatis web工程

    idea是一款强大的利器,最近公司换成采用springboot在eclipse上开发,因为idea的强大,故而,学习一下该利器,搭建springboot的web工程,在下面练习使用. 一.创建spri ...

  2. 升级安装go1.13.5

    运行文件时报错 verifying github.com/mattn/go-isatty@v0.0.10-0.20190818123653-bf9a1dea1961/go.mod: github.co ...

  3. MySQL5.7忘记密码解决方案

    第一种方法 首先是网上普遍见到的 关闭服务 windows下在C:\ProgramData(隐藏文件夹)\MySQL\MySQL Server 5.7\my.ini中的[mysqld]下添加skip- ...

  4. vue学习(五)生命周期 的钩子函数

    生命周期的钩子函数 主要有以下几种 beforeCreate created beforeMount mounted beforeUpdate updated activated deactivate ...

  5. React全局浮窗、对话框

    下面代码是组件源码: import React, {Component} from 'react' import {createPortal} from 'react-dom' import styl ...

  6. android 开发学习3

    DAO:DATA ACCESS OBJECT getApplication()和MainActivity.this 是两种不同的context,也是最常见的两种.第一种中context的生命周期与Ap ...

  7. tornado反向解析

    tornado反向解析 在路由中添加name属性,并且不能使用元组路由,应当由tornado.web.url定义路由. app = tornado.web.Application([ (r'/', I ...

  8. mac安装和启动mongodb

    使用使用 brew安装mongodb 可以使用 OSX 的 brew 来安装 mongodb: sudo brew install mongodb 如果要安装支持 TLS/SSL 命令如下: sudo ...

  9. 三十一、CI框架之使用验证码

    一.CI的验证码功能用着很是舒服,需要在根目录下新建一个captcha的验证码文件夹用于存放生产的图片,代码如下: 二.浏览器效果如下: 总结:关于验证码生产函数,有很多参数可以设置,包括字体,验证码 ...

  10. UVA 11992 懒惰标记应用

    这个题目要求和 还有 设置区间值 区间增值,明显要用线段树来 由于行数不超过20 而列数多达 10^5,所以对每一行建一棵线段树. 然后主要是在懒惰标记方面是难点 针对两种操作 分别设置 set 和 ...