7.Gin 路由详解 - 路由分组 - 路由文件抽离

7.Gin 路由详解 - 路由分组 - 路由文件抽离

前言

在前面的示例中,我们直接将路由的定义全部写在 main.go 文件中,如果后面 路由越来越多,那将会越来越不好管理。

所以,下一步我们应该考虑将路由进行分组管理,并且将其抽离 main.go的文件。

154c7febc20b78ee7e19061b8a0696e6.png
1696330394289

路由分组

我们可以将相同模块路径的作为一组,将路由进行分组处理。

71fdc2716e002fef2aff918712422b08.png
1696330862506
// 2.1 路由分组
// 设置根路径的路由分组
defaultRouter := r.Group("default/")
{
    // c.HTML 渲染模板
    defaultRouter.GET("index", func(c *gin.Context) {
       // 创建对象
       userInfo := UserInfo{
          Name:   "李白",
          Age:    30,
          Gender: "male",
       }
       // 渲染模板
       c.HTML(http.StatusOK, "default/index.html", gin.H{
          "title":    "default前台首页",
          "userInfo": userInfo,
          "score":    60,
          "hobby":    []string{"吃饭", "睡觉", "写代码"},
          "now":      time.Now(),
          "str1":     "hello",
          "str2":     "world",
       })
    })
}

adminGroup := r.Group("admin")
{
    adminGroup.GET("index", func(c *gin.Context) {
       c.HTML(http.StatusOK, "admin/index.html", gin.H{"title": "admin前台首页"})
    })
    adminGroup.GET("goods", func(c *gin.Context) {
       c.HTML(http.StatusOK, "admin/goods.html", gin.H{"title": "商品页面"})
    })
}

为了简单示例,我只是简单分了两个路由组,一个是 default ,另一个是 admin 的路由组。

测试如下:

  • 访问 default组的 index 路由:http://localhost:8000/default/index

8fc3be3365946a906c734eb371d0c8e6.png
1696330950278
  • 访问 admin组的index路由:http://localhost:8000/admin/index

763164cc4ac8012f18adf6cfcfb46983.png
1696330979558

从效果来看,我们可以将相同模块的路由进行分组,但是还是写在main.go代码文件中,下面我们将路由的内容抽离到其他文件。

路由文件抽离

不管是路由分组、还是普通的路由,我们都可以通过单独编写函数,抽离到其他模块去,避免路由代码全部写在 main.go 代码中。

下面我们来简单示例一下。

新建 routes 文件夹,并且按照不同的模块,创建不同的路由管理文件
0b59b3ad7a94514a6fe6057976da7c8f.png
1696331864037

AdminRouterInit 方法作为示例:

package routes

import (
    "github.com/gin-gonic/gin"
    "net/http"
)

// AdminRouterInit Admin路由分组
func AdminRouterInit(r *gin.Engine) {
    // 设置admin路由
    adminRouter := r.Group("admin")
    {
       adminRouter.GET("index", func(c *gin.Context) {
          c.HTML(http.StatusOK, "admin/index.html", gin.H{"title": "admin前台首页"})
       })
       adminRouter.GET("goods", func(c *gin.Context) {
          c.HTML(http.StatusOK, "admin/goods.html", gin.H{"title": "商品页面"})
       })
    }
}

在上面通过函数入参,将  r *gin.Engine 传入函数方法中,然后用来定义路由信息。

main.go 初始化路由
22e16c9325e769e185af9d3448489b6d.png
1696331972771
package main

import (
 "fmt"
 "github.com/gin-gonic/gin"
 "go-gin-pratice/routes"
 "html/template"
 "time"
)

// 定义时间格式转换的方法
func formatAsDate(t time.Time) string {
 year, month, day := t.Date()
 return fmt.Sprintf("%d/%02d/%02d", year, month, day)
}

// 定义打印信息的方法
func printlnMsg(str1 string, str2 string) string {
 return fmt.Sprintf("%s.....%s", str1, str2)
}

func main() {
 // 1.创建路由
 r := gin.Default()
 //注册全局模板函数 注意顺序,注册模板函数需要在加载模板上面
 r.SetFuncMap(template.FuncMap{
  "formatDate": formatAsDate,
  "printlnMsg": printlnMsg,
 })
 // 加载模板文件
 r.LoadHTMLGlob("templates/**/*")
 // 定义静态文件路径
 r.Static("/static", "static")

 // 2.绑定路由规则,执行的函数
 // gin.Context,封装了request和response

 // 2.1 初始化路由
 routes.DefaultRouterInit(r)
 routes.AdminRouterInit(r)
 routes.RootRouterInit(r)

 // 3.监听端口,默认在8080
 // 监听并在 0.0.0.0:8080 上启动服务
 // Run("里面不指定端口号默认为8080")
 r.Run(":8000")
}
测试效果
c5b3e2467bb4202ba0b3da6ddbc97f49.png
1696332022586

抽离了路由代码后,接口还是可以正常访问的,说明路由初始化正常。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/174582.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用jmeter对接口进行简单测试

JMeter是一个开源的性能测试工具,它可以对于Web应用程序、FTP、数据库服务器等各种服务器进行性能测试和负载测试,以确定它们是否能够承受预期的负载。JMeter支持多种协议和技术,如HTTP、HTTPS、FTP、JDBC、LDAP、SOAP、JMS等。它使用Java编写…

maven pom引入依赖不报红,但是项目Dependencies中没有引入jar包

前言 小编我将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注一下! 也许一个人独行,可以走的很快,但是一群人结伴而行,才能走的更远!让我们在成长的道路上互相学习&…

maven打包项目,然后给其他项目引用

A项目(这个项目需要被打包,作为被引入的项目),不需要启动类,因为作为公共模块被B项目引入: package com.yunya.mvndependontest.rest;import org.springframework.web.bind.annotation.RequestMapping; im…

kubeadm join 192.168.10.16:6443 --token xxx报错Failed to request cluster-info

1、node节点执行 kubeadm join 192.168.10.16:6443 --token hak4zi.hrib9uv4p62t1uok --discovery-token-ca-cert-hash sha256:4337638eef783ee6a66045ad699722079e071c2dfbaa21e37d3174f04d58ea97 --v2 报错 [discovery] Failed to request cluster-info, will try again: G…

Qt应用开发(进阶篇)——线程 QThread

一、前言 QThread类继承于QObject基类,是Qt经典基础工具类,QThread类提供了一种独立于平台的方式来管理线程,让开发者能够快速的完成多线程的创建和使用。 正常情况下,一个PC程序使用到多线程的概率是非常高的,在不同方…

智能座舱架构与芯片- (11) 软件篇 上

一、智能汽车基础软件平台分类 汽车软件主要分为应用软件和基础软件。应用软件和业务形态高度关联,不同控制器的应用软件之间差异较大。基础软件介于应用软件和硬件之间,用于屏蔽硬件特性、支撑应用软件。可有效地实现应用软件与硬件之间解耦&#xff0…

Kubernetes容器状态探测的艺术

在Kubernetes集群中维护容器状态更像是一种艺术,而不是科学。原文: The Art and Science of Probing a Kubernetes Container[1] 在Kubernetes集群中维护容器状态更像是一种艺术,而不是科学。 本文将带你深入理解容器探测[2],并特别关注相对较…

C++ LibCurl实现Web隐藏目录扫描

LibCurl是一个开源的免费的多协议数据传输开源库,该框架具备跨平台性,开源免费,并提供了包括HTTP、FTP、SMTP、POP3等协议的功能,使用libcurl可以方便地进行网络数据传输操作,如发送HTTP请求、下载文件、发送电子邮件等…

Stable Diffusion XL网络结构-超详细原创

强烈推荐先看本人的这篇 Stable Diffusion1.5网络结构-超详细原创-CSDN博客 1 Unet 1.1 详细整体结构 1.2 缩小版整体结构 以生成图像1024x1024为例,与SD1.5的3个CrossAttnDownBlock2D和CrossAttnUpBlock2D相比,SDXL只有2个,但SDXL的Cros…

如何选择示波器?

简介 对于很多工程师来讲,从市场中上百款不同价格和规格的各种型号的示波器中,选择一台新示波器是一件很挠首的事情。本文就旨在指引你拨开迷雾,希望能帮助你避免付出昂贵的代价。 重中之重 选择示波器的第一步不是要看那些示波器的广告和规…

MAVEN——PACKAGE、INSTALL、DEPLOY的联系与区别

我们在用maven构建java项目时,最常用的打包命令有mvn package、mvn install、deploy,这三个命令都可完成打jar包或war(当然也可以是其它形式的包)的功能,但这三个命令还是有区别的。下面通过分别执行这三个命令的输出结…

Openlayer【三】—— 绘制多边形GeoJson边界绘制

1.1、绘制多边形 在绘制多边形和前面绘制线有异曲同工之妙,多边形本质上就是由多个点组成的线然后连接组成的面,这个面就是最终的结果,那么这里使用到的是Polygon对象,而传给这个对象的值也是多个坐标,坐标会一个个的…

分享几个MicroPython开发的ES32项目源码

最近在学习物联网,必不可少的就是需要玩一下ESP8266和ESP32,当然开发它们的语言分为C/C 今天带给大家几个MicroPython开发的几个ESP32的项目源码,喜欢的童鞋可以关注一下 1、点亮开发板LED灯 from machine import Pinled_pin Pin(4,Pin.O…

软件测评中心进行安全测试有哪些流程?安全测试报告如何收费?

在当今数字化时代,软件安全测试是每个软件开发团队都不能忽视的重要环节。安全测试是指对软件产品进行系统、全面的安全性评测与检测的过程。它旨在发现并修复软件中存在的漏洞和安全隐患,以确保软件能够在使用过程中保护用户的数据和隐私不被非法访问和…

SpringSecurity+JWT权限认证

SpringSecurity默认的是采用Session来判断请求的用户是否登录的,但是不方便分布式的扩展 虽然SpringSecurity也支持采用SpringSession来管理分布式下的用户状态,不过现在分布式的还是无状态的Jwt比较主流 一、创建SpringBoot的项目 spring-boot-starte…

【giszz笔记】产品设计标准流程【8】

(续上回) 真的没想到写了8个章节,想参考之前文章的,我把链接给到这里。 【giszz笔记】产品设计标准流程【7】-CSDN博客 【giszz笔记】产品设计标准流程【6】-CSDN博客 【giszz笔记】产品设计标准流程【5】-CSDN博客 【giszz笔…

Transformer——encoder

本文参考了b站的Eve的科学频道中的深入浅出解释Transformer原理和DASOU讲AI中的Transformer从零详解。 入浅出解释Transformer原理 Transformer从零详解 前言: 在自然语言识别中,之前讲过lstm,但是lstm有明显的缺陷,就是当文本过…

[SCTF 2021]rceme

文章目录 前置知识可变参数绕过create_function注入无字母数字RCE动态链接库so绕过disable_functions利用php原生类进行文件读取 解题过程 前置知识 可变参数绕过 PHP 在用户自定义函数中支持可变数量的参数列表。在 PHP 5.6 及以上的版本中,由 … 语法实现&#x…

redis的过期策略以及定时器的实现

Redis是客户端服务器结构的程序,客户端与服务器通过网络通信,所以对于keys *这种的操作在大型企业中不太建议,生产环境下的key会非常多,Redis是但现成的服务器,执行keys*的时间非常长,就会导致redis服务器阻…

同为科技(TOWE)桌面PDU插排:一款可以DIY定制的“超级插座”

当今社会,各种电子产品和家用电器已成为人们日常生活中不可或缺的一部分,在带给人们便利的同时,也使得电力使用变得更加频繁和重要。然而,当前市面上很多普通插座由于功能单一、材质粗劣、插口数量受限、充电速度过慢、插头间互相…