【问题标题】:how to oragnize handlers in go as project gets bigger?随着项目变大,如何组织处理程序?
【发布时间】:2017-05-20 01:47:02
【问题描述】:

我正在使用Go 构建一个网站,并且我知道它是如何工作的以及如何使用handlefunc() 处理路由。但是,我的网站越来越大,我可能会有很多网址。问题是如何处理这一切?例如,我不能在我的main() 中添加例如 100+ 或 500+ handelfunc() 以匹配每个可能的路由或 URL。那么如何管理呢?提前致谢。

注意::

我的问题不需要任何代码。

【问题讨论】:

    标签: go


    【解决方案1】:

    你绝对不应该将 500+ HandleFunc 放在你的主目录中。

    首先,随着项目越来越大,您可能会创建模块和类型。

    然后,您可以从您的 main 委托给这些模块或类型,以便每个模块或类型随后自己注册句柄。

    此外,您的许多 URL 可能都会遵循一些模式,例如:

    "/articles/{id}"
    

    如果是这种情况,您应该只注册一次该模式,然后处理请求的函数可以根据参数{id}进行操作。

    如果使用模式,有几个库可以帮助管理路由,或者您也可以编写自己的路由逻辑。

    查看这个问题以了解有关该问题的一些替代方案:

    Wildcards in the pattern for http.HandleFunc

    例如,如果您使用Chi (https://github.com/pressly/chi) 来管理路由,您可以在主目录中执行以下操作:

    r := chi.NewRouter()
    r.Mount("/admin", adminRouter())
    

    然后在 adminRouter() 函数中,您继续创建将在 /admin 下提供的处理程序:

    func adminRouter() http.Handler {
        r := chi.NewRouter()
        r.Use(AdminOnly)
        r.Get("/", adminIndex)
        r.Get("/accounts", adminListAccounts)
        return r
    }
    

    (所有这些都来自Chi的文档)

    这只是一个例子,你可以用不同的方式实现类似的逻辑。

    【讨论】:

    • 你的意思是 main 有模块的处理程序,并且在每个模块中我可以更深入并添加导航更深的处理程序?
    • 是的,我用更具体的例子更新了我的答案
    • 我可以让不同的文件夹和处理程序导航到其中的某个函数,例如 python 中的 django 吗?还是不是好方法?因为我不想用 chis 我想用我自己的逻辑
    • 查看链接的答案,了解如何实现自己的路由器的基本示例。你最终可以实现类似于 django 工作方式的东西,但这将是一项相当大的努力。另外,即使你不使用框架,你也可以看看他们的源代码,看看他们是如何嵌套路由器的
    猜你喜欢
    • 2010-10-17
    • 2012-04-07
    • 1970-01-01
    • 2013-10-24
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    • 2012-06-26
    • 1970-01-01
    相关资源
    最近更新 更多