Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Golang Gin 实战(十一)| HTML模板渲染

Golang Gin 实战(十一)| HTML模板渲染

作者头像
飞雪无情
发布于 2020-01-13 07:50:55
发布于 2020-01-13 07:50:55
7.5K0
举报

终于又到一个重头戏了。在整个服务端开发中,一个是API,一个就是网页,当前的API大部分都是通过JSON提供了,而网页就是通过HTML提供了。所以对于这么大的需求,Gin当然不会忘记,为我们提供了很多方便的操作。

html/template

在聊Gin的HTML渲染之前,先聊聊Golang(Go语言)内置的html/template,因为Gin的HTML渲染就是基于html/template实现的。

1 2 3 4 5 6 7 8 9 10 11 12 13

func main() { r := gin.Default() r.GET("/html", func(c *gin.Context) { c.Status(200) const templateText = `微信公众号: {{printf "%s" .}}` tmpl, err := template.New("htmlTest").Parse(templateText) if err != nil { log.Fatalf("parsing: %s", err) } tmpl.Execute(c.Writer, "flysnow_org") }) r.Run(":8080") }

这段代码是通过Golang内置原生的html/template达到HTML渲染的目的,运行这段程序,访问http://localhost:8080/html可以看到如下信息:

代码语言:javascript
AI代码解释
复制
微信公众号: flysnow_org

Gin 实现

我们自己实现的这些,看着是比较臃肿的,在Gin中,它做了很好的封装,实现起来就很简单。

html/index.html

代码语言:javascript
AI代码解释
复制
微信公众号: {{printf "%s" .}}

1 2 3 4 5 6 7 8

func main() { r := gin.Default() r.LoadHTMLFiles("html/index.html") r.GET("/html", func(c *gin.Context) { c.HTML(200, "index.html", "flysnow_org") }) r.Run(":8080") }

首先创建了一个index.html模板,放在html文件夹下,内容很简单。

然后通过r.LoadHTMLFiles("html/index.html")加载这个模板文件,这样我们才能使用它。

使用的方式非常简单,通过c.HTML(200, "index.html", "flysnow_org")即可。

这样我么运行这段代码的结果,和上面例子是一样的。

加载目录文件

r.LoadHTMLFiles方法其实已经可以加载多个模板文件了,但是如果我们模板文件太多的话,使用它就比较麻烦,对此Gin提供了LoadHTMLGlob方法,可以加载一个目录下的所有模板。

1

r.LoadHTMLGlob("html/*")

上面的改成这样,表示加载html目录下的所有模板文件,效果是一样的。

如果你的模板目录结构是这样的:

代码语言:javascript
AI代码解释
复制
html/user/index.html
html/admin/index.html
html/product/index.html

也就是都有一个子目录,模板文件都在子目录里,那么我们可以采用这样的模式进行加载。

代码语言:javascript
AI代码解释
复制
r.LoadHTMLGlob("html/**/*")

自定义函数

在HTML模板中,可能会需要一些复杂的操作,这个时候我们就可以定义一个函数来帮我们解决。Gin的自定义函数其实也是基于html/template的,这里以自己实现一个md5加密为例,演示自定义模板函数的使用。

1 2 3 4

func MD5(in string) (string, error) { hash := md5.Sum([]byte(in)) return hex.EncodeToString(hash[:]), nil }

首先自定义一个MD5函数。

1 2 3 4 5

r := gin.Default() r.SetFuncMap(template.FuncMap{ "md5": MD5, }) r.LoadHTMLGlob("html/*")

然后通过SetFuncMap方法把我们自定义的函数Set进去,并且要在LoadHTMLGlob加载模板之前,不然不起作用。

这里的template.FuncMap其实是个map[string]interface{},key表示在模板中使用的函数名,value是对应的实现函数。

1

type FuncMap map[string]interface{}

好了,现在自定义实现后,我们就可以在模板中使用。

1 2 3

微信公众号: {{printf "%s" .}} <br/> MD5加密:{{md5 .}}

运行打开浏览器访问,可以看到如下信息:

代码语言:javascript
AI代码解释
复制
微信公众号: flysnow_org
MD5加密:2d707f4e40f77bd777e928bd69d8091e

Gin使用的是html/template模板库,自带了一些函数,但是还是不够用的,我前段时间做了一个开源的模板函数库,实现了大量的常用函数,可以直接使用。https://github.com/flysnow-org/soha

其他能力

在Gin提供的HTML渲染能力中,还有一些其他小能力,比如可自定义界定符,默认的是{{}},我们可以改掉它。

1

r.Delims("{{{","}}}")

比如改成三个{{{}}},但是这里也要注意的是,一定要模板加载之前设置。

在一个小能力就是可以自定义模板解析引擎。Gin提供的LoadHTMLFilesLoadHTMLGlob其实就是设置模板引擎的过程,只不过Gin做了封装,让我们可以简便的使用。

1 2 3 4 5 6 7 8 9 10 11 12 13

func (engine *Engine) LoadHTMLGlob(pattern string) { left := engine.delims.Left right := engine.delims.Right templ := template.Must(template.New("").Delims(left, right).Funcs(engine.FuncMap).ParseGlob(pattern)) engine.SetHTMLTemplate(templ) } func (engine *Engine) LoadHTMLFiles(files ...string) { templ := template.Must(template.New("").Delims(engine.delims.Left, engine.delims.Right).Funcs(engine.FuncMap).ParseFiles(files...)) engine.SetHTMLTemplate(templ) }

所以呢,我们可以直接自己通过template.Must生成自己的模板引擎,然后通过engine.SetHTMLTemplate就可以了。这样我们通过template.Must生成模板引擎的过程,就可以自己灵活自定义,达到自己的目的,比如刚刚讲的界定符。

小结

Golang自带的模板引擎已经足够强大和简洁了,再配合自定义函数和模块化,我认为足够用,所以我们只需要Gin就可以很方便的开发出网页应用,不需要其他更复杂的框架。更多关于HTML渲染的,可以加入我的星球Golang Gin 实战,有更深入的讨论,一对一的答疑,公众号和博客没有的源代码分析

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020年1月9日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Gin 模板系统深度解析:客服系统实战开发
在现代 Web 开发中,模板引擎是构建动态网页的核心工具。Gin 作为 Go 语言中最受欢迎的 Web 框架之一,内置了对 Go 标准库 html/template 的支持。本文将深入探讨 Gin 模板系统的使用技巧、常见陷阱以及最佳实践。
唯一Chat
2025/09/13
1700
gin框架之HTML模板渲染
我们才用define的方式定义了模板名称,加载模板的时候我们可以直接写模板的名称。例如
大话swift
2020/03/12
6K0
Golang框架Gin入门实战--(3)HTML模板渲染及模板语法(上)
Golang框架Gin入门实战–(3)HTML模板渲染及模板语法(上) package main import "github.com/gin-gonic/gin" type Article struct { Title string Content string } func main() { r := gin.Default() //加载模板 r.LoadHTMLGlob("templates/**/*") //前台 r.GET("/", func(c *gin.Context
互联网-小阿宇
2022/11/21
8700
Golang框架Gin入门实战--(3)HTML模板渲染及模板语法(上)
Gin-Web-Framework官方指南中文(下篇)
ShouldBind,ShouldBindJSON,ShouldBindXML,ShouldBindQuery,ShouldBindYAML
小诚信驿站
2019/10/31
2.5K0
Gin-Web-Framework官方指南中文(下篇)
Golang框架Gin入门实战--(6)Gin路由文件抽离
GINDEMO目录下创建一个routers目录 并在routers目录下创建三个go文件 adminRouters.go
互联网-小阿宇
2022/11/21
8450
Golang框架Gin入门实战--(4)HTML模板渲染以及模板语法 自定义模板函数 静态文件服务(下)
此篇文章内容基于上篇文章继续修改Golang框架Gin入门实战–(3)HTML模板渲染及模板语法(上)
互联网-小阿宇
2022/11/21
8980
Golang框架Gin入门实战--(4)HTML模板渲染以及模板语法 自定义模板函数 静态文件服务(下)
你会高效写http服务器吗?Gin实战演练
胖sir开始捣鼓http服务器,在寻求一种高效的解决方式且高性能的解决方式...
阿兵云原生
2023/02/16
2.4K0
Golang Gin 实战(十)| XML渲染
虽然当前基于XML的API应用不多,但是Gin也提供了便捷的XML生成,可以把这些用于需要XML的地方,比如网站的sitemap,rss订阅的atom等。
飞雪无情
2020/02/11
1.9K0
4.Gin HTML 模板渲染
有时候我们在使用模板语法的时候会不可避免的引入一下空格或者换行符,这样模板最终渲染出来的内容可能就和我们想的不一样,这个时候可以使用{{-语法去除模板内容左侧的所有空白符号, 使用-}}去除模板内容右侧的所空白符号。
Devops海洋的渔夫
2023/11/20
1K0
4.Gin HTML 模板渲染
7.Gin 路由详解 - 路由分组 - 路由文件抽离
在前面的示例中,我们直接将路由的定义全部写在 main.go 文件中,如果后面 路由越来越多,那将会越来越不好管理。
Devops海洋的渔夫
2023/11/20
1.2K0
7.Gin 路由详解 - 路由分组 - 路由文件抽离
Golang框架Gin入门实战--(8)Gin中间件详解 路由中间件 全局中间件 路由分组中间件
根据上篇文章进行修改 只把修改过的文件进行展示 没修改过的跟之上一篇一样 目录结构
互联网-小阿宇
2022/11/21
1.2K0
Golang框架Gin入门实战--(8)Gin中间件详解 路由中间件 全局中间件 路由分组中间件
Go 语言 | 1.16 新增的embed在各流行Web框架中的应用
在前几天刚发布的Golang 1.16版本中,新增了一个大家期待已久的特性//go:embed,它的作用就是可以在Go语言应用程序中包含任何文件、目录的内容,也就是说我们可以把文件以及目录中的内容都打包到生成的Go语言应用程序中了,部署的时候,直接扔一个二进制文件就可以了,不用再包含一些静态文件了,因为它们已经被打包到生成的应用程序中了。
飞雪无情
2021/03/03
3.6K0
Gin框架入门系列-路由与控制器及静态网站
路由是一个过程,指的是一个http请求,如何找到对应的处理器函数(也可以叫控制器函数),Gin框架的路由是基于httprouter包实现的。
用户10002156
2023/11/06
4550
Gin框架入门系列-路由与控制器及静态网站
深入Gin框架内幕(一) 顶
Gin是一个用 Go (Golang) 编写的 web 框架。它是一个类似于martini但性能更好的API框架,不同于谢大主导的Beegoweb框架,后者更像是Python语言中的Django框架,内部包含了开发一个web程序所需的各种组件。
BGBiao
2020/02/13
1.9K0
Golang下的html/template模块使用
关于template模板,Golang语言提供了两个包text/template和html/template,前者主要用来处理文本文件的变量渲染,而后者主要用于对html之类的网页文件进行渲染。由于最近在使用gin框架编写REST API,顺便学习template的使用,再此记录一下。
BGBiao
2019/09/16
1.4K0
go : gin 加载html
本文介绍使用 LoadHTMLGlob() or LoadHTMLFiles() 加载html资源
IT工作者
2022/07/25
1.7K0
Golang框架Gin入门实战--(7)Gin中自定义控制器以及实现控制器的继承
GINDEMO\controllers\admin/articleController.go
互联网-小阿宇
2022/11/21
1.2K0
Golang框架Gin入门实战--(7)Gin中自定义控制器以及实现控制器的继承
GoWeb基础——Text/HTML模板
{{}}来包含需要在渲染时被替换的字段,{{.}}表示当前的对象 如果要访问当前对象的字段通过{{.FieldName}},但是需要注意一点:这个字段必须是导出的(字段首字母必须是大写的),否则在渲染的时候就会报错
羊羽shine
2019/05/29
6380
gin简单学习,自己根据狂神课程写的笔记。
下载:go get -u github.com/gin-gonic/gingo get -u github.com/thinkerou/favicon测试代码 package main ​ import "github.com/gin-gonic/gin" ​ func main() { //创建一个服务 engine := gin.Default() ​ //访问地址,处理请求 engine.GET("/hello", func(context *gin.Context) {
用户8478947
2023/01/25
5950
Golang Gin 实战(一)| 快速安装入门
Gin 是一个非常优秀的Golang Web Framework,它不光API友好,性能也非常高,并且设计简洁,便于入门。所以它(Gin)非常受欢迎,在Github上已经三万三千多个星星,也是我最喜欢的Web 框架。
飞雪无情
2020/02/10
2K0
推荐阅读
相关推荐
Gin 模板系统深度解析:客服系统实战开发
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
首页
学习
活动
专区
圈层
工具
MCP广场
首页
学习
活动
专区
圈层
工具
MCP广场