当前位置: 首页 > news >正文

衡水网页网站建设如何进行网站宣传推广

衡水网页网站建设,如何进行网站宣传推广,网页设计的工作流程,济南网站建设行知keji在我们开发定义路由的时候,可能会遇到很多部分重复的路由:/admin/users/admin/manager/admin/photo以上等等,这些路由最前面的部分/admin/是相同的,如果我们一个个写也没问题,但是不免会觉得琐碎、重复,无用…

在我们开发定义路由的时候,可能会遇到很多部分重复的路由:

/admin/users
/admin/manager
/admin/photo

以上等等,这些路由最前面的部分/admin/是相同的,如果我们一个个写也没问题,但是不免会觉得琐碎、重复,无用劳动,那么有没有一种更好的办法来解决呢?Gin为我们提供的解决方案就是分组路由

分组路由

类似以上示例,就是分好组的路由,分组的原因有很多,比如基于模块化,把同样模块的放在一起,比如基于版本,把相同版本的API放一起,便于使用。在有的框架中,分组路由也被称之为命名空间。

假如我们现在要升级新版本APi,但是旧的版本我们又要保留以兼容老用户。那么我们使用Gin就可以这么做

func main() {
    r := gin.Default()

    //V1版本的API
    v1Group := r.Group("/v1")
    v1Group.GET("/users", func(c *gin.Context) {
        c.String(200, "/v1/users")
    })
    v1Group.GET("/products", func(c *gin.Context) {
        c.String(200, "/v1/products")
    })

    //V2版本的API
    v2Group := r.Group("/v2")
    v2Group.GET("/users", func(c *gin.Context) {
        c.String(200, "/v2/users")
    })
    v2Group.GET("/products", func(c *gin.Context) {
        c.String(200, "/v2/products")
    })

    r.Run(":8080")
}

只需要通过Group方法就可以生成一个分组,然后用这个分组来注册不同路由,用法和我们直接使用r变量一样,非常简单。这里为了便于阅读,一般都是把不同分组的,用{}括起来。

    v1Group := r.Group("/v1")
    {
        v1Group.GET("/users", func(c *gin.Context) {
            c.String(200, "/v1/users")
        })
        v1Group.GET("/products", func(c *gin.Context) {
            c.String(200, "/v1/products")
        })
    }

    v2Group := r.Group("/v2")
    {
        v2Group.GET("/users", func(c *gin.Context) {
            c.String(200, "/v2/users")
        })
        v2Group.GET("/products", func(c *gin.Context) {
            c.String(200, "/v2/products")
        })
    }

路由中间件

通过Group方法的定义,我们可以看到,它是可以接收两个参数的:

func (group *RouterGroup) Group(relativePath string, handlers ...HandlerFunc) *RouterGroup

第一个就是我们注册的分组路由(命名空间);第二个是一个...HandlerFunc,可以把它理解为这个分组路由的中间件,所以这个分组路由下的子路由在执行的时候,都会调用它。

这样就给我们带来很多的便利,比如请求的统一处理,比如/admin分组路由下的授权校验处理。比如刚刚上面的例子:

    v1Group := r.Group("/v1", func(c *gin.Context) {
        fmt.Println("/v1中间件")
    })

这样不管你是访问/v1/users,还是访问/v1/products,控制台都会打印出/v1中间件

Group的方法定义,还可以看到,我们可以注册多个HandlerFunc,对分组路由进行多次处理。

分组路由嵌套

我们不光可以定义一个分组路由,还可以在这个分组路由中再添加一个分组路由,达到分组路由嵌套的目的,这种业务场景也不少,比如:

/v1/admin/users
/v1/admin/manager
/v1/admin/photo

V1版本下的admin模块,我们使用Gin可以这么实现。

    v1AdminGroup := v1Group.Group("/admin")
    {
        v1AdminGroup.GET("/users", func(c *gin.Context) {
            c.String(200, "/v1/admin/users")
        })
        v1AdminGroup.GET("/manager", func(c *gin.Context) {
            c.String(200, "/v1/admin/manager")
        })
        v1AdminGroup.GET("/photo", func(c *gin.Context) {
            c.String(200, "/v1/admin/photo")
        })
    }

如上代码,再调用一次Group生成一个分组路由即可,就是这么简单,通过这种方式你还可以继续嵌套。

原理解析

那么以前这种分组路由这么方便,实现会不会很复杂呢?我们来看看源代码,分析一下它的实现方式。

在分析之前,我们先来看看我们最开始用的GET方法签名。

func (group *RouterGroup) GET(relativePath string, handlers ...HandlerFunc) IRoutes {
    return group.handle("GET", relativePath, handlers)
}

注意第一个参数relativePath,这是一个相对路径,也就是我们传给Gin的是一个相对路径,那么是相对谁的呢?

func (group *RouterGroup) handle(httpMethod, relativePath string, handlers HandlersChain) IRoutes {
    absolutePath := group.calculateAbsolutePath(relativePath)
    handlers = group.combineHandlers(handlers)
    group.engine.addRoute(httpMethod, absolutePath, handlers)
    return group.returnObj()
}

通过这句absolutePath := group.calculateAbsolutePath(relativePath)代码,我们可以看出是相对当前的这个group(方法接收者)的。

现在calculateAbsolutePath方法的源代码我们暂时不看,回过头来看Group这个生成分组路由的方法。

func (group *RouterGroup) Group(relativePath string, handlers ...HandlerFunc) *RouterGroup {
    return &RouterGroup{
        Handlers: group.combineHandlers(handlers),
        basePath: group.calculateAbsolutePath(relativePath),
        engine:   group.engine,
    }
}

这里要注意的是,我们通过gin.Default()生成的gin.Engine其实包含一个RouterGroup(嵌套组合),所以它可以用RouterGroup的方法。

Group方法又生成了一个*RouterGroup,这里最重要的就是basePath,它的值是group.calculateAbsolutePath(relativePath),和我们刚刚暂停的分析的方法一样,既然这样,就来看看这个方法吧。

func (group *RouterGroup) calculateAbsolutePath(relativePath string) string {
    return joinPaths(group.basePath, relativePath)
}

就是一个基于当前RouterGroupbasePath的路径拼接,所以我们通过Group方法改变新生成RouterGroup中的basePath,就达到了路由分组的目的。

同时因为多次调用Group方法,都是基于上一个RouterGroupbasePath拼接成下一个RouterGroupbasePath,也就达到了路由分组嵌套的目的。

而我们通过gin.Default()生成的最初的gin.Engine ,对应的basePath/,根节点。

这是一种非常棒的代码实现方式,简单的代码,是强大的功能。

小结

分组路由的功能非常强大, 可以帮助我们进行版本的升级,模块的切分,而且它的代码实现又非常简单,这就是优秀的代码。通过分析,我们可以学到很多,也能提升很多,让自己的能力不知不觉的超越同行,同事。

精彩文章推荐

Golang Gin 实战(六)| 获取Form表单参数和原理分析

Golang Gin 实战(五)| 接收数组和map

Golang Gin 实战(四)| URL查询参数的获取和原理分析

Golang Gin 实战(三)| 路由参数

Golang Gin 实战(二)| 简便的Restful API 实现

Golang Gin 实战(一)| 快速安装入门

我有几个的Go语言交流微信群,可以扫码关注公众号flysnow_org或者网站 https://www.flysnow.org/,加我好友,我拉你进来。

ba1a51887bcc0b26f0df63abf9d38432.png

扫码关注

http://www.lbrq.cn/news/2374201.html

相关文章:

  • 网站建设准备工作总结最厉害的搜索引擎
  • 广东cba最新消息百度seo怎么样优化
  • 网站有些什么内容友情链接qq群
  • 四川微信网站建设百度广告联盟app
  • 网站模板去哪下载广告投放优化师
  • 外贸网站建设培训google谷歌搜索
  • 那个网站做国外售货最好的推广平台排名
  • 四川网站建设方案指数平滑法
  • 合肥企业网站seo网站排名优化服务
  • app在线开发网站建设网站收录软件
  • 上海武汉阳网站建设免费域名注册官网
  • 郴州吧百度seo详解
  • 做图片视频的网站有哪些问题吗北京网站制作建设公司
  • 公司网站报价今天国际新闻
  • 蚌埠市建设工程质监站网站制作网站的基本流程
  • 网站做的好的公司名称好搜网惠州seo
  • 产品的营销渠道有哪些seo网络推广哪家专业
  • 推广是什么百度禁止seo推广
  • 大连网站建设那家好深圳营销推广引流公司
  • 国泰君安建设工程官方网站企业网站推广渠道有哪些
  • 网站pv uv是什么意思互联网营销师培训内容
  • 西安cms建站网站搭建工具
  • 网站建设服务公司有用吗百度公司注册地址在哪里
  • 泰州网站建设托管谷歌优化排名公司
  • 做长海报的网站济南网络推广公司
  • 一般可以建些什么种类的网站百度荤seo公司
  • 荔湾区网站建设免费推广引流怎么做
  • 有投标功能的网站怎么做东莞网络营销公司
  • 一般给公司做网站怎么收费自媒体营销代理
  • 公司设计网站需要注意哪些网站优化分析
  • UGUI 性能优化系列:第一篇——基础优化与资源管理
  • 初试Spring AI实现聊天功能
  • 阿里云-通义灵码:隐私保护机制—为数据安全筑起铜墙铁壁
  • [硬件电路-28]:从简单到复杂:宇宙、芯片与虚拟世界的共通逻辑
  • 深入核心:理解Spring Boot的三大基石:起步依赖、自动配置与内嵌容器
  • 网络编程(套接字)