1. 简单用法

package main

import (
"github.com/gin-contrib/multitemplate"
"github.com/gin-gonic/gin"
"path/filepath"
) func createMyRender() multitemplate.Renderer {
r := multitemplate.NewRenderer()
basePath, _ := filepath.Abs("templates")
r.AddFromFiles("index", basePath + `\base.html`, basePath + `\index.html`)
r.AddFromFiles("article", "templates/base.html", "templates/index.html", "templates/article.html")
return r
} func main() {
router := gin.Default()
router.HTMLRender = createMyRender()
router.GET("/", func(c *gin.Context) {
c.HTML(200, "index", gin.H{
"title": "Html5 Template Engine",
})
})
router.GET("/article", func(c *gin.Context) {
c.HTML(200, "article", gin.H{
"title": "Html5 Article Engine",
})
})
router.GET("/json", func(context *gin.Context) {
context.String(200, "OK")
}) router.Run()
}

  

2. 高级用法

package main

import (
"github.com/gin-contrib/multitemplate"
"github.com/gin-gonic/gin"
"path/filepath"
) func main() {
router := gin.Default()
router.HTMLRender = loadTemplates("./templates")
router.GET("/", func(c *gin.Context) {
c.HTML(200, "index.html", gin.H{
"title": "Welcome!",
})
})
router.GET("/article", func(c *gin.Context) {
c.HTML(200, "article.html", gin.H{
"title": "Html5 Article Engine",
})
})
router.GET("/login", func(context *gin.Context) {
context.HTML(200, "login.html", gin.H{
"title": "Login",
})
}) router.Run()
} func loadTemplates(templatesDir string) multitemplate.Renderer {
r := multitemplate.NewRenderer() adminLayouts, err := filepath.Glob(templatesDir + "/layouts/base_admins.html")
if err != nil {
panic(err.Error())
}
adminInclude, err := filepath.Glob(templatesDir + "/admins/*.html")
if err != nil {
panic(err.Error())
}
// Generate our templates map from our layouts/ and articles/ directories
for _, include := range adminInclude {
layoutCopy := make([]string, len(adminLayouts))
copy(layoutCopy, adminLayouts)
files := append(layoutCopy, include)
r.AddFromFiles(filepath.Base(include), files...)
} articleLayouts, err := filepath.Glob(templatesDir + "/layouts/base_articles.html")
if err != nil {
panic(err.Error())
}
articleInclude, err := filepath.Glob(templatesDir + "/articles/*.html")
if err != nil {
panic(err.Error())
}
// Generate our templates map from our layouts/ and articles/ directories
for _, include := range articleInclude {
layoutCopy := make([]string, len(articleLayouts))
copy(layoutCopy, articleLayouts)
files := append(layoutCopy, include)
r.AddFromFiles(filepath.Base(include), files...)
} return r
}

  

项目结构

gin中的多模板和模板继承的用法的更多相关文章

  1. Effective C++ 第二版 40)分层 41)继承和模板 42)私有继承

    条款40 通过分层来体现"有一个"或"用...来实现" 使某个类的对象成为另一个类的数据成员, 实现将一个类构筑在另一个类之上, 这个过程称为 分层Layeri ...

  2. Django——4 模板标签 模板的继承与引用

    Django 模板标签 常用标签 模板的继承与引用 模板标签 标签在渲染的过程中提供任意的逻辑 标签语法: 由%}和 {% 来定义的,例如:{%tag%} {%endtag%} 这个定义是刻意模糊的. ...

  3. Django入门--模板标签、继承与引用

    一.模板标签 Django模板引擎提供的可以在模板中进行的各种逻辑操作,是函数调用的一种特殊形式,如循环.判断等功能,期语法规则为: {% tag %} content {% tag 参数1 参数2 ...

  4. C++中的智能指针类模板

    1,智能指针本质上是一个对象,这个对象可以像原生的指针一样使用,因为智能指 针相关的类通过重载的技术将指针相关的操作符都进行了重载,所以智能指针对象可以像原生指针一样操作,今天学习智能指针类模板,通过 ...

  5. WPF中的ControlTemplate(控件模板)(转)

    原文地址 http://www.cnblogs.com/zhouyinhui/archive/2007/03/28/690993.html WPF中的ControlTemplate(控件模板)     ...

  6. eclipse中添加Java代码注释模板

    eclipse中添加Java代码注释模板 1.Window->Preference->Java->Code Style->Code Template,进入注释编辑界面 2.文件 ...

  7. Win10系列:JavaScript 项目模板中的文件和项模板文件

    通过上面内容的学习,相信读者已经对各种项目模板和项模板有了大致的了解,本节将进一步介绍项目模板中默认包含的项目文件以及项模板文件,首先讲解这些文件中的初始内容以及作用,然后介绍在一个页面中如何添加控件 ...

  8. JBOSS 中oracle-ds.xml的配置模板

    http://blog.csdn.net/bo_hai/article/details/6076979 JBOSS 中oracle-ds.xml的配置模板.   代码模版: <?xml vers ...

  9. WPF中的ControlTemplate(控件模板)

    原文:WPF中的ControlTemplate(控件模板) WPF中的ControlTemplate(控件模板)                                             ...

  10. python制作简单excel统计报表3之将mysql数据库中的数据导入excel模板并生成统计图

    python制作简单excel统计报表3之将mysql数据库中的数据导入excel模板并生成统计图 # coding=utf-8 from openpyxl import load_workbook ...

随机推荐

  1. ACwing1212. 地宫取宝

    题目: X 国王有一个地宫宝库,是 n×m 个格子的矩阵,每个格子放一件宝贝,每个宝贝贴着价值标签. 地宫的入口在左上角,出口在右下角. 小明被带到地宫的入口,国王要求他只能向右或向下行走. 走过某个 ...

  2. JAVA中SpringMVC获取bean方法,在工具类(utils)注入service

    有时候我们会出现无法用注解 @Autowired 注入bean的情况,这个时候可以 通过contextLoader获取 WebApplicationContext ctx = ContextLoade ...

  3. 【九度OJ】题目1183:守形数 解题报告

    [九度OJ]题目1183:守形数 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1183 题目描述: 守形数是这样一种整数, ...

  4. 【九度OJ】题目1190:大整数排序 解题报告

    [九度OJ]题目1190:大整数排序 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1190 题目描述: 对N个长度最长可达 ...

  5. 【.NET 遇上 GraphQL】 ChilliCream 平台介绍

    ChilliCream ChilliCream 是一个开源免费的 GraphQL 平台, 提供了构建.管理, 和访问 GraphQL API 的端到端的解决方案. https://chillicrea ...

  6. 快速恢复update了的orcale数据表

    在update的时候 没有写条件 将整个表中的数据全部都更新了,这时候怎么办呢? orcale提供了以下的方法产看某一个时间戳, 所执行的sql的语句内容, 同时可以利用该这个时间戳查看当时语句执行显 ...

  7. 关于python常用的命令

    os模块: os.system os.system("cat/cmd等...") os.popen print os.popen("adb shell ls ../aa. ...

  8. Entropy, relative entropy and mutual information

    目录 Entropy Joint Entropy Conditional Entropy Chain rule Mutual Information Relative Entropy Chain Ru ...

  9. [opencv]opencv主要组件介绍

    [calib3d]--其实就是就是Calibration(校准)加3D这两个词的组合缩写.这个模块主要是相机校准和三维重建相关的内容.基本的多视角几何算法,单个立体摄像头标定,物体姿态估计,立体相似性 ...

  10. 使用 Eclipse 可视化插件 windowbuilder 进行Java GUI开发(插件安装的两种方法)

    对于Java GUI开发 其实最方便的方法是用插件制作,当然先了解完代码原理是最好的. eclispe安装windowbuilder有两种方式,一种是离线安装,一种是在线安装. 一.第一种在线安装: ...