请教,gin 的路由这样写有什么优劣?

qufo · 2021-02-16 17:38:10 · 1652 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2021-02-16 17:38:10 的主题,其中的信息可能已经有所发展或是发生改变。

gin 的路由一般是这样写的。

`

  route.GET("/tags",GetTags)

  route.GET("/articles",GetArticles)

  route.GET("/authors",GetAuthors)

`

这样写的话,意味着 Tags 控制器里的列表,方法名叫 GetTagsArticles 控制器里的列表功能,叫 GetArticles , Author 控制器里的列表其方法名叫 GetAuthors. 有没有办法把他们的方法名统一起来呢,都叫 func Index 或者 func List 不好吗?

另一种方法,是这样。 `

  route.GET("/tags",(&Controller.TagsController{}).Index)

  route.GET("/articles",(&Controller.ArticlesController{}).Index)

  route.GET("/authors",(&Controller.AuthorsController{}).Index)

` 这样,列表方法的名称统一了,

这两种方法,各有什么优劣么?


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1652 次点击  
加入收藏 微博
6 回复  |  直到 2021-02-18 13:31:57
avtion
avtion · #1 · 4年之前

简单的才是最好的,下面的那种很明显就是面向对象后遗症,不过也没有什么优劣之分,纯粹看公司领导或者项目要求,通常是上面那种,毕竟函数可以分版本

focusonline
focusonline · #2 · 4年之前
avtionavtion #1 回复

简单的才是最好的,下面的那种很明显就是面向对象后遗症,不过也没有什么优劣之分,纯粹看公司领导或者项目要求,通常是上面那种,毕竟函数可以分版本

面对对象没啥不好, 事实上数据载体和业务代码分离不是什么坏事.如果面对对象那么差,go的下一个重大特性就不是泛型的实现了.

Tristone
Tristone · #3 · 4年之前

第二种看着脑阔都疼

jarlyyn
jarlyyn · #4 · 4年之前

……

我是第一种的爱好者。

第一种其实最主流的是出现在nodejs的框架,比如express里。

他的思路是函数化,也就是每个路由对应一个函数,不过度oop,不是用控制器类,更常见的是在入口函数前堆一堆middleware,用middleware的组合来进行控制

第二种没见过,常见的是直接把一个控制器类传递进去。

一般路径直接和控制器类名/动作名相关。

优点是维护路由,便于继承。

对于动作的过滤/配置,一般依靠控制器的设置,以及控制器类的继承来实现。

两种方式都有各自的优缺点。

第一种更适合做轻量,简单的服务。

第二种适合做基础服务,框架等需要继承的。

go的应用场景更偏第一种。

jarlyyn
jarlyyn · #5 · 4年之前

另外就是你的例子里路由最大的优势,自注释性体现的不明显。

我找点我大概的代码看一下,你就会发现,哪怕我把注释全去了,你也能够在一个文件里大概的了解到这个uri大概做了什么,有那些控制动作。

第二种方式需要看继承树,虽然功能强大,调整简单,但不够直观

var PublishMiddlewares = func() middleware.Middlewares {
    return middleware.Middlewares{
        protecters.ProtectMiddleware("appkey"),
        middlewares.PublishExists(),
        au.New().WithAny(
            au.MustParse("root"),
            au.MustParse("publishall"),
            au.MustParseWith(
                "publish:id={{0}}",
                httpinfomanager.MustGetStringField("filename").LoadStringInfo,
            ),
        ).ServeMiddleware,
    }
}

var RouterFactory = router.NewFactory(func() router.Router {
    var Router = httprouter.New()
    Router.StripPrefix("/publish").
        Use(PublishMiddlewares()...).
        Handle(RouterPublishFactory.CreateRouter())
}

var RouterPublishFactory = router.NewFactory(func() router.Router {
    var Router = httprouter.New()
    Router.POST("/:path").
        Handle(httppublish.CreatePublishHandler(notificationpublisher.Publisher, notificationbuilder.Builder))
    return Router
})
jarlyyn
jarlyyn · #6 · 4年之前

另外,再看了遍你的原文。

你原文里的问题,是你对go的思路还不够了解,脑洞也不够。

你完全不该去建立个控制器对象,只需要把代码放在不同的包里面,直接引用包里export出来的action就可所以了。

比如

import (
    "modules/middlewares"

    "modules/captcha"
    "modules/ticket/ticketactions"
    "modules/user/session"
    "modules/user/useractions"

)


func newTicketRouter() router.Router {
    var Router = httprouter.New()
    Router.
        POST("/create").
        HandleFunc(ticketactions.ActionCreate)
    Router.
        GET("/list").
        HandleFunc(ticketactions.ActionList)
    Router.
        GET("/get/:id").
        HandleFunc(ticketactions.ActionGet)
    Router.
        POST("/reply/:id").
        HandleFunc(ticketactions.ActionReply)
    return Router
}
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传