Go:如何在不重命名的情况下处理包冲突?

时间:2016-03-27 10:24:07

标签: go middleware

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

所以我试图实现的解决方案是扩展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.go echo.go 都打包为中间件,但我无法“导出”这些功能来自导入的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()包被导出。

1 个答案:

答案 0 :(得分: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包的需要,代价是不需要的重复代码。