gin框架路由拆分与注册

本文总结了我平时在项目中积累的关于gin框架路由拆分与注册的若干方法。

gin框架路由拆分与注册

基本的路由注册

下面最基础的gin路由注册方式,适用于路由条目比较少的简单项目或者项目demo。

package main

import (
"net/http" "github.com/gin-gonic/gin"
) func helloHandler(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"message": "Hello q1mi!",
})
} func main() {
r := gin.Default()
r.GET("/hello", helloHandler)
if err := r.Run(); err != nil {
fmt.Println("startup service failed, err:%v\n", err)
}
}

路由拆分成单独文件或包

当项目的规模增大后就不太适合继续在项目的main.go文件中去实现路由注册相关逻辑了,我们会倾向于把路由部分的代码都拆分出来,形成一个单独的文件或包:

我们在routers.go文件中定义并注册路由信息:

package main

import (
"net/http" "github.com/gin-gonic/gin"
) func helloHandler(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"message": "Hello q1mi!",
})
} func setupRouter() *gin.Engine {
r := gin.Default()
r.GET("/hello", helloHandler)
return r
}

此时main.go中调用上面定义好的setupRouter函数:

func main() {
r := setupRouter()
if err := r.Run(); err != nil {
fmt.Println("startup service failed, err:%v\n", err)
}
}

此时的目录结构:

gin_demo
├── go.mod
├── go.sum
├── main.go
└── routers.go

把路由部分的代码单独拆分成包的话也是可以的,拆分后的目录结构如下:

gin_demo
├── go.mod
├── go.sum
├── main.go
└── routers
└── routers.go

routers/routers.go需要注意此时setupRouter需要改成首字母大写:

package routers

import (
"net/http" "github.com/gin-gonic/gin"
) func helloHandler(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"message": "Hello q1mi!",
})
} // SetupRouter 配置路由信息
func SetupRouter() *gin.Engine {
r := gin.Default()
r.GET("/hello", helloHandler)
return r
}

main.go文件内容如下:

package main

import (
"fmt"
"gin_demo/routers"
) func main() {
r := routers.SetupRouter()
if err := r.Run(); err != nil {
fmt.Println("startup service failed, err:%v\n", err)
}
}

路由拆分成多个文件

当我们的业务规模继续膨胀,单独的一个routers文件或包已经满足不了我们的需求了,

func SetupRouter() *gin.Engine {
r := gin.Default()
r.GET("/hello", helloHandler)
r.GET("/xx1", xxHandler1)
...
r.GET("/xx30", xxHandler30)
return r
}

因为我们把所有的路由注册都写在一个SetupRouter函数中的话就会太复杂了。

我们可以分开定义多个路由文件,例如:

gin_demo
├── go.mod
├── go.sum
├── main.go
└── routers
├── blog.go
└── shop.go

routers/shop.go中添加一个LoadShop的函数,将shop相关的路由注册到指定的路由器:

func LoadShop(e *gin.Engine)  {
e.GET("/hello", helloHandler)
e.GET("/goods", goodsHandler)
e.GET("/checkout", checkoutHandler)
...
}

routers/blog.go中添加一个`LoadBlog的函数,将blog相关的路由注册到指定的路由器:

func LoadBlog(e *gin.Engine) {
e.GET("/post", postHandler)
e.GET("/comment", commentHandler)
...
}

在main函数中实现最终的注册逻辑如下:

func main() {
r := gin.Default()
routers.LoadBlog(r)
routers.LoadShop(r)
if err := r.Run(); err != nil {
fmt.Println("startup service failed, err:%v\n", err)
}
}

路由拆分到不同的APP

有时候项目规模实在太大,那么我们就更倾向于把业务拆分的更详细一些,例如把不同的业务代码拆分成不同的APP。

因此我们在项目目录下单独定义一个app目录,用来存放我们不同业务线的代码文件,这样就很容易进行横向扩展。大致目录结构如下:

gin_demo
├── app
│ ├── blog
│ │ ├── handler.go
│ │ └── router.go
│ └── shop
│ ├── handler.go
│ └── router.go
├── go.mod
├── go.sum
├── main.go
└── routers
└── routers.go

其中app/blog/router.go用来定义post相关路由信息,具体内容如下:

func Routers(e *gin.Engine) {
e.GET("/post", postHandler)
e.GET("/comment", commentHandler)
}

app/shop/router.go用来定义shop相关路由信息,具体内容如下:

func Routers(e *gin.Engine) {
e.GET("/goods", goodsHandler)
e.GET("/checkout", checkoutHandler)
}

routers/routers.go中根据需要定义Include函数用来注册子app中定义的路由,Init函数用来进行路由的初始化操作:

type Option func(*gin.Engine)

var options = []Option{}

// 注册app的路由配置
func Include(opts ...Option) {
options = append(options, opts...)
} // 初始化
func Init() *gin.Engine {
r := gin.Default()
for _, opt := range options {
opt(r)
}
return r
}

main.go中按如下方式先注册子app中的路由,然后再进行路由的初始化:

func main() {
// 加载多个APP的路由配置
routers.Include(shop.Routers, blog.Routers)
// 初始化路由
r := routers.Init()
if err := r.Run(); err != nil {
fmt.Println("startup service failed, err:%v\n", err)
}
}

总结

gin框架是一个非常容易扩展的web框架,本文是我在日常编码中总结的一点点经验,因为世界上不可能有完全相同的项目,每个人也都有自己的编程习惯,关于gin框架路由注册的方式我就在此抛砖引玉了。

gin框架路由拆分与注册的更多相关文章

  1. gin框架中的路由拆分与注册

    基本的路由注册 下面最基础的gin路由注册方式,适用于路由条目比较少的简单项目或者项目demo. package main import ( "net/http" "gi ...

  2. 一步一步分析Gin框架路由源码及radix tree基数树

    Gin 简介 Gin is a HTTP web framework written in Go (Golang). It features a Martini-like API with much ...

  3. Go语言基础之20--web编程框架之Gin框架

    一.Gin框架介绍 1.1 简介 A. 基于httprouter开发的web框架. http://github.com/julienschmidt/httprouter B. 提供Martini风格的 ...

  4. 01 . Go框架之Gin框架从入门到熟悉(路由和上传文件)

    Gin框架简介 Gin是使用Go/Golang语言实现的HTTP Web框架, 接口简洁, 性能极高,截止1.4.0版本,包含测试代码,仅14K, 其中测试代码9K, 也就是说测试源码仅5k左右, 具 ...

  5. gin框架中的路由

    基本路由 gin框架中采用的路由库是基于httrouter做的 地址为:https://github.com/julienschmidt/httprouter httprouter路由库 点击查看代码 ...

  6. Gin 框架 - 安装和路由配置

    目录 概述 Gin 安装 路由配置 推荐阅读 概述 看下 Gin 框架的官方介绍: Gin 是一个用 Go (Golang) 编写的 web 框架. 它是一个类似于 martini 但拥有更好性能的 ...

  7. gin框架封装自己的路由 ②

    在一个项目中,我们会有很多路由,那么我们该如何更好的管理自己的路由,在多人协同的情况下可以更好的规范路由呢,我来说一下自己的做法 1.承接gin框架初识(先跑一个简单demo) ①,先创建一个cont ...

  8. Gin框架系列02:路由与参数

    回顾 上一节我们用Gin框架快速搭建了一个GET请求的接口,今天来学习路由和参数的获取. 请求动词 熟悉RESTful的同学应该知道,RESTful是网络应用程序的一种设计风格和开发方式,每一个URI ...

  9. gin框架的路由源码解析

    前言 本文转载至 https://www.liwenzhou.com/posts/Go/read_gin_sourcecode/ 可以直接去原文看, 比我这里直观 我这里只是略微的修改 正文 gin的 ...

随机推荐

  1. git 让忽略.gitignore文件马上生效

    在.gitignore文件里面输入 *.zip 表示所有zip文件忽略更改 /bin 表示忽略整个根目录的bin文件夹 /src/aa.jar 表示忽略/src/aa.jar文件 设置完.gitign ...

  2. 1040 Longest Symmetric String

    Given a string, you are supposed to output the length of the longest symmetric sub-string. For examp ...

  3. win 远程桌面 ubuntu

    开始 起因 因为工作需求经常要远程 局域网内的 Ubuntu设备 之前用的一直是 Teamviver 但是最近不知怎么了,Teamviver发病 打不开了,也懒得折腾了! 简单的记录一下 能用的几种连 ...

  4. video播放视频以及相关事件

    <!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="Conten ...

  5. Spring Cloud 微服务架构整理记录与示例首页

    ---------------------------目录-------------------------------- 一.SpringCloud系列组件实战(Eureka.Ribbon.Hyst ...

  6. 病毒木马查杀实战第013篇:一个基于.NET的“敲竹杠”病毒研究

    前言 恶意程序发展至今,其功能已经从最初的单纯破坏,不断发展为隐私的窥探,信息的盗取,乃至如今非常流行的"敲竹杠"病毒,用于勒索.可见随着时代的发展,病毒的作者们往往也是想利用自己 ...

  7. hdu1054 简单最小顶点覆盖

    题意:       给你一些点,和一些边,如果把一个点安装保护装置,那么与他直接相连的点就可以被保护,题目问的是最少安装多少个点能让所有的点都被保护. 思路:       这是最基础的二分图最少定点覆 ...

  8. Known Notation 39届亚洲赛牡丹江站K题

    题意:       题意,哎!说道题意就蛋疼啊,比赛的时候就愣是把这个题目读成数字可以随意组合,比如123 可以拆成1 23 ,12 3 ,1 2 3,结果显然,水题当神题,各种想不出来,然后就显然的 ...

  9. Linux-鸟菜-5-文件权限

    Linux-鸟菜-5-文件权限 Linux作为多用户多任务的操作系统,文件权限以及目录配置相对于Windows的话应该更重要更细致一些.Linux一般将文件可存取的身份分为三个类别,分别是owner/ ...

  10. ExtJS4中Ext.onReady、Ext.define、Ext.create

    1.Ext.onReady 说明:onReady内的语句块会在页面上下文加载后再执行. 2.Ext.define 说明:创建类,可以继承其他类,也可以被继承. 例子1: 1 <script ty ...