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. Spring学习(三)几种集合属性的注入方式

    1.前言 众所周知.java中不只有八大简单类型.还有一些集合类型.本文围绕集合类型的注入做一个总结. 2.项目骨架 3.过程 1.创建实体类AllCollectionType package com ...

  2. 【LeetCode】1047. Remove All Adjacent Duplicates In String 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 栈 日期 题目地址:https://leetcode ...

  3. 【九度OJ】题目1198:a+b 解题报告

    [九度OJ]题目1198:a+b 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1198 题目描述: 实现一个加法器,使其能 ...

  4. 【LeetCode】167. Two Sum II - Input array is sorted 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 Java解法 Python解法 日期 题目地址:ht ...

  5. 【LeetCode】365. Water and Jug Problem 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 数学题 相似题目 参考资料 日期 题目地址:http ...

  6. Java Web大作业——编程导航系统

    title: Java Web大作业--编程导航系统 categories: - - 计算机科学 - Java abbrlink: 40bc48a1 date: 2021-12-29 00:37:35 ...

  7. 【Azure 应用服务】探索在Azure上设置禁止任何人访问App Service的默认域名(Default URL)

    问题描述 总所周知,Azure App Service服务会默认提供一个 ***.chinacloudsites.cn为后缀的域名,但是该域名由上海蓝云网络科技有限公司备案,仅用于向其客户提供 Azu ...

  8. uniapp蓝牙传输中文乱码问题

    问题描述:app接收到蓝牙传出过来的二进制数据,1.app进行arrbuff转成16进制字符串 // ArrayBuffer转16进度字符串示例 function ab2hex(buffer) { c ...

  9. CS5266参数|Capstone CS5266|CS5266应用方案

    随着目前手机.笔电和平板类产品都是用的Type-C接口,特别是苹果类的笔电和平板就只有一个Type-C接口,在很多工作.学习.娱乐中突显很多不方便的情况,别是需要一些其他的功能如:鼠标键盘接口USB2 ...

  10. 每天学一点——while循环(2)、for循环

    while循环(2) while+continue 打印数字的话相信朋友们在python中不会一个个的print吧 eg: 或者是打印列表里的元素 eg 这种方法只适用于你知道里面有多少个元素, 不然 ...