Gin(三):配合模板 Tmpl

Go语言注释规范:从文档到工程基础设施的完整指南 Go注释远不止代码说明,而是驱动godoc生成、CI校验、pkg.go.dev排名和工具链解析的核心基础设施。其本质是Go‘约定优于配置’哲学的文本化体现,遵循严格的语法归属规则(如//必须紧贴导出标识符)、文档协议(包注释三行结构、段落折叠)与工具语义(//go:build、//go:generate)。高质量注释直接影响API可发现性、错误处理可靠性及跨平台构建稳定性,尤其在微服务、CLI工具和SDK开发中构成基础工程能力。本文系统梳理注释在语法层、文档层、工具链层和生态层的四重作用机制,并提供可落地的 阅读详情
640?wx_fmt=png

点击蓝字关注我

640?wx_fmt=png

原文首发于 https://youngxhui.top

640?wx_fmt=jpeg


前面的学习已经对 Gin 有了一个初步的认识和了解,对router的简单使用也有了一定的掌握,那么今天就来使用 Gin 来渲染出我们的html页面吧。

640 ?添加模板 640

我们仍旧是在上一章节的项目中进行修改。


首先新建一个templates文件夹,用于存放我们的模板文件,在文件夹中新建立index.tmpl。并且编写我们的模板。


 
 <!doctype html>	
 <html lang="en">	
 <head>	
     <meta charset="UTF-8">	
     <meta name="viewport"	
           content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">	
     <meta http-equiv="X-UA-Compatible" content="ie=edge">	
     <title>Gin Hello</title>	
 </head>	
 <body>	
 <main>{{ .title }}</main>	
 </body>	
 </html>


小提示GoLand 现在还未对 tmpl 有高亮显示语法,我们可以将 .tmpl 后缀文件添加到 go Template 模板。方法如下:File-settings-Editor-File Types。(或者我们直接使用 *.gohtml 做为模板也是可以的)如图:


640?wx_fmt=jpeg


我们可以通过LoadHTMLGlob和LoadHTMLFiles两个方法来对我们的模板进行加载。其中LoadHTMLGlob方法可以将一个目录下所有的模板进行加载,而LoadHTMLFiles只会加载一个文件,他的参数为可变长参数,需要我们一个一个的手动将模板文件填写。这里我们使用LoadHTMLGlob方法。



 
 router.LoadHTMLGlob("templates/*")


此时我们需要修改我们的/路由了,不再是让它返回一个字符串,而是返回我们的页面模板。


在handler中新建立一个indexHandler.go,用来处理我们的/路由。


 
 func Index(context *gin.Context) {	
   context.HTML(http.StatusOK, "index.tmpl", gin.H{	
     "title": "hello gin " + strings.ToLower(context.Request.Method) + " method",	
   })	
 }


此时在访问我们的页面,仍旧是hello gin get method,但是这和我们之前返回的字符串是不同的。


打开浏览器-Network 就可以看到这两个页面的不同,一个是text一个是html


640?wx_fmt=jpeg


写完具体功能,我们需要改造一下我们的单元测试,针对新的接口逻辑原有的单元测试已经行不通了。


重新修改单元测试。



 
 func TestIndexHtml(t *testing.T) {	
   router := initRouter.SetupRouter()	
   w := httptest.NewRecorder()	
   req, _ := http.NewRequest(http.MethodGet, "/", nil)	
   router.ServeHTTP(w, req)	
   assert.Equal(t, http.StatusOK, w.Code)	
 }


进行单元测试的时候,发现报错了,报错原因是竟然是找不到html。


 --- FAIL: TestIndexGetRouter (0.00s)
 panic: html/template: pattern matches no files: `templates/*` [recovered]
 panic: html/template: pattern matches no files: `templates/*`


此时就感到很奇怪了,为什么网页上可以很好的访问到,在测试中却无法访问呢?


查了很多资料没有找到原因,很多解决方法是将templates写成全路径,这显然不是很好的解决方法。官方对于单元测试介绍少的可怜。

这里我介绍一种方法:


我们需要修改方法,通过判断不同的模式(debug,release,test)来加载不同路径下的templates。


initRouter.go


 
 // 省略部分代码	
 if mode := gin.Mode(); mode == gin.TestMode {	
     router.LoadHTMLGlob("./../templates/*")	
 } else {	
     router.LoadHTMLGlob("templates/*")	
 }


同时,也需要修改test,我们要写个init方法,这里的  init 方法就好比java中Junit中的@Before



 
package test	
 	
 import (	
   "GinHello/initRouter"	
   "github.com/gin-gonic/gin"	
   "github.com/stretchr/testify/assert"	
   "net/http"	
   "net/http/httptest"	
   "testing"	
 )	
 	
 var router *gin.Engine	
 	
 func init() {	
   gin.SetMode(gin.TestMode)	
   router = initRouter.SetupRouter()	
 }	
 	
 func TestIndexHtml(t *testing.T) {	
   w := httptest.NewRecorder()	
   req, _ := http.NewRequest(http.MethodGet, "/", nil)	
   router.ServeHTTP(w, req)	
   assert.Equal(t, http.StatusOK, w.Code)	
   assert.Contains(t,w.Body.String(),"hello gin get method","返回的HTML页面中应该包含 hello gin get method")	
 }


这样完善了单元测试,方便日后的功能更改。

640 ✨添加静态资源
640

当网页可以正常显示的时候,我们可以添加一些静态资源来使我们的页面更加美观。我在这里选择了Bootstrap 4做为一个 UI 界面框架。Bootstrap 4 下载


同时还要引入Jquery和Popper。


我们新建一个statics文件夹,将我们Bootstrap解压,将js和css复制到statics目录下。


在我们的initRouter 中,对静态资源进行添加。



 
 router.Static("/statics","./statics")


新建header.tmpl


 
 {{ define "header" }}	
     <nav class="navbar navbar-expand-lg navbar-light bg-light">	
         <a class="navbar-brand" href="#">Gin Hello</a>	
         <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent"	
                 aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">	
             <span class="navbar-toggler-icon"></span>	
         </button>	
 	
         <div class="collapse navbar-collapse" id="navbarSupportedContent">	
             <ul class="navbar-nav mr-auto">	
                 <li class="nav-item active">	
                     <a class="nav-link" href="#">主页 <span class="sr-only">(current)</span></a>	
                 </li>	
                 <li class="nav-item">	
                     <a class="nav-link" href="#">文章列表</a>	
                 </li>	
                 <li class="nav-item">	
                     <a class="nav-link " href="#" tabindex="-1" aria-disabled="true">关于</a>	
                 </li>	
             </ul>	
             <form class="form-inline my-2 my-lg-0">	
                 <input class="form-control mr-sm-2" type="search" placeholder="Search" aria-label="Search">	
                 <button class="btn btn-outline-success my-2 my-sm-0" type="submit">搜索</button>	
             </form>	
             <ul class="navbar-nav ">	
                 <li class="nav-item">	
                     <a class="nav-link" href="#">登录</a>	
                 </li>	
                 <li class="nav-item">	
                     <a class="nav-link" href="#">注册</a>	
                 </li>	
             </ul>	
         </div>	
     </nav>	
 {{end}}


并在我们的index.tmpl上进行添加


 
 <body>	
 <header>	
     {{template "header"}}	
 </header>	
 <main>	
     {{ .title }}	
 </main>	
 </body>


此时运行我们的网站,出现下图样式。

640 ?添加网站图标 640

万事俱备,只欠一个icon。


网站此时还缺少网站的图标,网站图标也是通过 Gin 给定的函数设置。我们将.ico图片放到项目根目录下,然后在initRouter中设置。



 
  router.StaticFile("/favicon.ico","./favicon.ico")


再次运行我们的网站,此时就会发现网站的左上角标签页中出现了设置好的图标。

640 ✍总结 640

通过本章节的介绍和学习,可以很快的使用 Gin 中的静态资源,定义网站图标等。

640 ?‍?本章节代码 640

获取本章节代码,点击阅读原文

往期推荐

Gin(一):Hello Gin

Gin(二):路由


640?wx_fmt=jpeg好看的人才能点 640


Go自定义错误设计:从基础结构体到可观测性集成 在Go语言中,error是一个接口类型,本质是可检查的值而非需捕获的异常。其默认实现仅提供字符串描述,缺乏堆栈、上下文、错误码和可断言能力,导致错误处理冗长、排查困难、监控低效。通过构建结构化自定义错误——包括带字段的结构体错误、支持errors.Is的错误码模式、支持%w包装的链式错误,以及集成OpenTelemetry与HTTP状态码的标准化错误工厂——可将模糊的error字符串升级为携带业务语义、可追踪、可聚合、可自动告警的领域错误对象。这直接支撑微服务可观测性建设与前端精准错误响应。 阅读详情

相关推荐

【信息科学与工程学】计算机科学与自动化——第三百零四篇 高性能系统开发指南06

376: 分布式配置中心+配置加密+密钥管理+自动轮换+审计+回滚+健康检查+灰度+多集群+多租户+配置漂移检测+自动修复+合规+联邦学习+混沌工程+事件驱动+多语言SDK+配置可视化+配置模板+变量替换+配置对比+差异可视化+配置导入导出+配置订阅+WebHook+配置权限管理+RBAC+配置标签+配置搜索+配置依赖图+配置影响分析+配置历史趋势+配置预测+配置自动生成+配置推荐+配置健康评分+配置自愈+配置拓扑+配置热加载。故障恢复时,从上一个完成的checkpoint恢复,未提交的文件被丢弃。

weixin_49199313的博客 265

[Go]在vscode中添加对模板文件tmpl的html语法自动补全的支持

1、打开设置界面 依次点击:“文件” --> “首选项” --> “设置” 2、打开文件配置 依次点击:“文本编辑器” --> “文件” --> “在settings.json中编辑” 3、添加对tmpl后缀文件的html语法自动补全支持 4、效果 html关键字高亮显示,输入标签后可以自动补全 ...

郭老二 4111

Word中 Go to endnote 出现闪退问题解决办法

Word中 Go to endnote 出现闪退问题解决办法

努力努力努力 1万+

Gin 笔记(06)— 设置不同启动模式、优雅启动和关闭、运行多个不同端口的服务进程

Gin 设置不同启动模式、优雅启动和关闭、运行多个不同端口的服务进程

wohu1104的专栏 3113

普通人如何上岸华为OD-面试总结

总共有3道算法题,100分值的两道,200分值的一道,不同的毕业院校和专业,通过机试的分值不一样,最少需要150分通过,提前和hr联系,了解自己需要多少分通过。重中之重:哪怕你是背的题库,也请你一定不要直接抄原来的,最好是变更下方法名,否则会判定你重复率过高,从而失去后面的面试机会(实在是不会做再用此方法,凑分数所用,面试官能看到你的代码,会影响你的面试评价)本人女,所以还问道了婚育计划,有对象这点可以说,没有问题,但是如果可以的话,生孩子的时间,可以给hr说这几年不考虑。如果说没有难题,直接就挂了。

weixin_47767264的博客 5457

Cadence IC618与Spectre231安装:环境变量与License配置详解

在Linux系统中部署Virtuoso等EDA工具时,环境变量与License管理是决定工具能否顺利启动的核心环节。环境变量决定了系统如何找到工具二进制文件以及工具如何定位自身资源,而License则通过FlexLM授权机制控制工具的使用权限。理解PATH、CDS_ROOT、CDS_LIC_FILE等关键变量的作用,掌握lmgrd服务与lmstat验证方法,能显著减少安装后启动失败的概率。无论是学生初装Cadence IC618与Spectre231,还是实验室工作站需要搭建可用的模拟设计环境,理顺环境变量

weixin_29192365的博客 372

Gin(三):模板tmpl

前面的学习已经对 Gin 有了一个初步的认识和了解,对 router 的简单使用也有了一定的掌握,那么今天就来使用 Gin 来渲染出我们的 html 页面吧。

代码猎奇站 6040

头歌平台-人工智能导论实验(人脸识别)

答案仅供参考,自己动手丰衣足食!!!

qq_52119136的博客 3027

Gin Mode的选择

我在阅读别人的代码的时候,发现下列这行代码。 gin.SetMode(gin.ReleaseMode) 本来不懂为什么需要设定模式,查看了gin源码,发现该框架提供了下列三种模式。 const ( // DebugMode indicates gin mode is debug. DebugMode = "debug" // ReleaseMode indicates gin mode i...

程序员早早的博客 2万+

基于八叉树的k近邻搜索

在八叉树中,每个节点都表示一个正方体的体积元素(体素),并且每个节点都有八个子节点(在不为空的情况下)。搜索最近邻点:一旦确定了查询点在八叉树中的位置,就可以开始搜索最近邻点了。搜索过程通常从查询点所在的叶节点开始,并逐步扩展到相邻的叶节点和父节点,直到找到k个最近邻点为止。k近邻搜索的目标是在给定的点云数据中,找到一个查询点的k个最近邻点。定位查询点:在搜索过程中,首先需要确定查询点在八叉树中的位置。返回结果:最后,搜索算法会返回找到的k个最近邻点的索引和它们与查询点之间的距离。

twnkie的博客 674

设备接入与APP(应用程序)接入华为云iotDA平台的详细操作步骤及获取方式

设备及APP(应用程序) 登录 IoTDA 平台所需的 入场与操作清单内容,提供逐项详细操作步骤和获取方式,并穿插贴士便于理解与实际操作落地。内容基于 华为云 IoTDA 控制台 和 IAM 控制台 的实际使用路径整理。

hy行者勇哥的博客 3060

GIN框架的三种运行模式两种引擎注册怎么选择?

GIN框架的三种运行模式两种引擎注册怎么选择?

m0_70208894的博客 1971

动力学约束下的运动规划算法——状态栅格规划器(State Lattice Planner)

A*、RRT等算法建立的用于路径搜索的图模型是不考虑机器人的动力学约束的,其构建的图模型的两个相邻节点之间的路径可能是不可行的,或者很难被机器人跟踪的,现在我们想要使得图中相邻两个节点间的连接是一种满足动力学约束的可行的连接,那么如何构建一个这样的图呢? 构建这样的图通常有两种方法:第一种是基于控制空间的采样(正向方法)

慕羽★的博客 3107

gin 如何返回html_Gin(三):与模板配合使用 tmpl,go web 开发最火框架之一

经过Gin(二):路由Router ,go语言框架学习的学习,已经对 Gin 有了一个初步的认识和了解,对 router 的简单使用也有了一定的掌握,那么今天就来使用 Gin 来渲染出我们的 html 页面吧。添加模板我们仍旧是在上一章节的项目中进行修改。首先新建一个 templates 文件夹,用于存放我们的模板文件,在文件夹中新建立 index.tmpl。并且编写我们的模板。 Gi...

weixin_39834745的博客 1382

让 ABAP 再次优雅:全面认知 ABAP Development Tools for SAP HANA(ADT)与可运行示例

本文介绍了ABAP开发工具ADT(ABAP Development Tools for SAP HANA)的核心概念与价值。ADT是基于Eclipse的现代化ABAP集成开发环境,支持ABAP Platform、S/4HANA等后端开发,提供代码编辑、CDS数据建模、质量检查等全流程功能,相比传统SAP GUI具有显著优势。文章详细阐述了ADT与SAP HANA的关系、关键能力模块(如代码重构、CDS建模、质量管控等),并通过一个制造企业案例说明其实际应用场景。最后提供了ADT安装指南和一个完整的ABAP

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 673

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

htmx-go 实战项目:构建一个完整的Todo应用(Go + HTMX)

在现代化的Web开发中,HTMX技术正在改变我们构建交互式应用的方式。htmx-go 是一个专为Go语言设计的类型安全库,它让你能够轻松处理HTMX请求和响应,无需繁琐的HTTP头操作。本教程将带你使用htmx-go库快速构建一个功能完整的Todo应用,体验Go与HTMX的完美结合。😊 ## 为什么选择htmx-go? htmx-go 是一个**类型安全**的Go库,专门用于与HTMX框架配

gitblog_00855的博客 381

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Gin 中自定义 Model(模板)测试

如果我们的应用非常简单的话,我们可以在Controller里面处理常见的业务逻辑。但是如果我们有一个功能想在多个控制器、或者多个模板里面复用的话,那么我们就可以把公共的功能单独抽取出来作为一个模块(ModelModel是逐步抽象的过程,一般我们会在Model里面封装一些公共的方法让不同 Controller使用,也可以在Model中实现和数据库打交道将在入口文件内的方法进行抽离到单独的文件例如:将此前转换时间的方法进行抽离到models下的modletest.go。

阿澈不吃蒜的博客 338

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Go Web开发使用mode控制日志输出

我们可以通过Gin框架修改“gin.SetMode()”函数来设定运行模式。默认情况下,Gin处于“debug”模式,这会提供更详细的日志信息。在生产环境中,我们应该将其切换到“release”模式以减少日志输出并提高性能。Gin框架允许我们自定义日志处理逻辑,这样就可以根据不同的模式将日志输出到不同的位置,比如控制台、文件等。在生产环境中,我们可以通过创建一个自定义的“Logger”实例来实现将日志写入文件中。如果不做特殊配置,Gin默认使用控制台输出日志,这对于开发环境已经足够了。

Gaorui678的博客 457

【go语言】Gin框架介绍和使用

Gin中的中间件必须是一个 gin.HandlerFunc 类型的。// StatCost 是一个统计耗时请求耗时的中间件c.Set("name", "小王子") // 可以通过c.Set在请求上下文中设置值,后续的处理函数能够取到该值// 调用该请求的剩余处理程序c.Next()// 不调用该请求的剩余处理程序// 计算耗时。

加油,考上985的研究生 5024

Gin框架的使用

以上就是今天要讲的内容,本文仅仅简单介绍了Gin框架的使用,更多的用法请参考官方文档。

m0_56137272的博客 2309

Gin中html模版渲染错误-panic: html/template: pattern matches no files: `templates/*`

博主在学习Gin框架的时候,学习知识点使用gin渲染html模版,不过出现了文章标题的错误,通过英译可以很清楚的了解到:是因为没有匹配的文件,所以就很纳闷,为什么?是以相对路径的方式来进行文件匹配的,那么我们便将其修改为绝对路径再进行代码运行!修改后为代码版本2!因为这涉及到文件不匹配的问题,我们可以尝试的从路径这个方面进行思考,因为代码中使用。总结:两个方法:1)使用绝对路径;2)修改工作目录,用相对路径。4、此时,我们保持代码属于版本1,即不做任何改动,运行程序!2、浏览器访问(同样正确!)

Czh的博客 2455

goland(intellij)中语法高亮tmpl文件

我们知道golang中模板文件一般是以tmpl为后缀的,其实是html文件插入一些go变量,本质还是html文件。但是默认这些文件被识别为普通文本文件,如下:我们希望tmpl文件被识别为html文件,这样可以高亮,方便我们阅读。有两种方法。第一种方法:在对应文件上右键,选择菜单"Associate with File Type"选择HTMl类型,然后确认:第二种方法:直接在首选项中...

idwtwt的专栏 9549

Gin中如何自定义Model

Gin中如何自定义ModelModel?是逐步抽象的过程,一般我们会在 Model里面封装一些公共的方法让不同 Controller 使用,也可以在 Model 中实现和数据库打交道。

yuanlaile的博客 706

【Gin-v1.9.0源码阅读】mode.go

【Gin-v1.9.0源码阅读】mode.go

深漂小码哥 448

goland中使用gin渲染html文件时出现 pattern matches no files: 错误

goland中使用gin渲染html文件时出现 pattern matches no files: 错误 问题表现出现了如下错误: panic: html/template: pattern matches no files: `templates/**/*`

Michael to Learn 7673

panic: html/template: pattern matches no files: `./views/**/*`报错处理

GO Gin Demo Gin 简单入门学习 问题描述 今天早上在添加web 模板的时候 提示找不到模板路径 panic: html/template: pattern matches no files: ./views/**/* 项目结构是这个样子的 Router 添加 Router.LoadHTMLGlob("./views/**/*") //这样不行 Router.LoadHTMLGlob("views/**/*") 这样的也不行 折腾好久都没有结果 最好找到一个帖子:https://

记录下日常遇到的问题或者一些思考,不喜勿喷 2842
上一篇: Gin(一):Hello Gin
下一篇: Gin(四):表单数据提交和模型绑定
代码猎奇站
博客等级 码龄7年 39粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值