【问题标题】:Go: How to Handle Package Collisions without Renaming?Go:如何在不重命名的情况下处理包冲突?
【发布时间】:2016-03-27 10:24:07
【问题描述】:

我正在尝试在不重命名的情况下解决包冲突,因为我认为它不是特别优雅。所以目前我有自己的中间件,它只处理数据库连接,但我也使用来自 Echo 的中间件。 Echo 也使用 middleware 作为中间件的包名。

所以我正在尝试实施的解决方案是扩展 Echo 的包的解决方案。但我没有任何成功,也没有找到任何关于这样做的信息。

在此处查看 echo 中间件:https://github.com/labstack/echo/tree/master/middleware

main.go

package main


import (
    "github.com/facebookgo/grace/gracehttp"
    "github.com/labstack/echo"
    "github.com/labstack/echo/engine/standard"
    "gitlab.com/project/middleware" //This is the middleware repository
    "github.com/asaskevich/govalidator"
    "gopkg.in/mgo.v2"
    "gopkg.in/mgo.v2/bson"
    "encoding/json"
    "log"
)


func main() {
    e := echo.New()

    e.Use(middleware.Db()) //Custom middleware
    e.Use(middleware.Logger()) //Echo middleware
    e.Use(middleware.Recover()) //Echo middleware

    //Compile fails because Logger and Recover are not being exported.

    e.Post("/", createUser())
    e.Get("/", getUser())
    e.Put("/", updateUser())
    e.Delete("/", removeUser())

    s := standard.New(":3000")
    s.SetHandler(e)
    gracehttp.Serve(s.Server)
}

中间件结构

├── middleware
│   ├── db.go //Custom middleware
│   └── echo.go //Echo middleware

所以 db.goecho.go 都被打包为 middleware,但我无法“导出”这些函数来自导入的 Echo 包。

echo.go

package middleware

import (
    . "github.com/labstack/echo/middleware"
)

//Stop compiler errors
//Echo middleware is usually accessed with middleware.Logger
//But by using the preceding dot, you can drop the prefix
var _ = Logger()

GO 的编译失败,因为 Logger()Recover() 函数尽管被大写却没有被导出 - 而 db.go 中的 Db() em> 包已导出。

【问题讨论】:

    标签: go middleware


    【解决方案1】:

    您的导入解决方案不起作用,因为即使在没有标识符的情况下导入了 echo middleware 包,它导出的标识也不是您的 middleware 包的一部分。点导入只是一种语法糖……顺便说一句,不建议使用。

    如果您真的不想使用包重命名(恕我直言,这是更好的解决方案),您可以定义自己的方法来在包中创建中间件。

    package middleware
    
    import "github.com/labstack/echo"
    import "github.com/labstack/echo/middleware"
    
    func Logger () echo.MiddlewareFunc {
        return middleware.Logger()
    }
    

    这将有效地消除主代码中对 echo/middleware 包的需求,但代价是重复的代码实际上并不需要。

    【讨论】:

    • 但是对于 echo/middleware 中的每个函数,是否有一种实用的方法来执行此操作? tbh,正如你所说,如果这是我能走的唯一路线,那我最好重命名我的 pkg。
    猜你喜欢
    • 2013-07-05
    • 2011-07-27
    • 1970-01-01
    • 2015-02-16
    • 2021-08-02
    • 2021-08-10
    • 2011-01-29
    • 1970-01-01
    • 2023-01-14
    相关资源
    最近更新 更多