Golang打包并在包

时间:2017-03-11 09:47:08

标签: logging go packages

所以我有点想知道这里的最佳做法是什么。

我有一个带有几个子包的应用程序,有些需要访问我在主包中的记录器,因为我使用带有颜色和时间戳等的自定义记录器。

通过像这样注射它来实现这一目标的唯一方法是什么? (假设Handler在一个名为command的子包中)

type Handler struct {
    logger logging.Logger
}

func NewHandler(logger logging.Logger) Handler {
    return Handler{
         logger: logger,
    }
} 

handler := command.NewHandler(logger)

我遇到的这个问题是测试变得烦人,因为我必须模拟记录器进行测试。 我想过只返回应该记录的错误并让主程序包处理它们,但是我想像这样运行一些异步函数

go handler.HandleMessage(msg)

所以idk如何处理来自异步函数的错误,或者它是否可能。

那么有最好的做法可以做我想要的吗?

1 个答案:

答案 0 :(得分:2)

对此有一些想法:

  1. 在我看来,注入资源(记录器)是最好的方法。直接引用全局变量当然是可能的,但会使您的代码难以更改。
  2. 如果你记录.Logger是一个具体类型,那么你可以在nil时使它工作,所以允许你在测试中跳过初始化。
  3. 您绝对可以在异步调用中处理错误。
  4. 在最后一点,您可以使用匿名函数在调用站点添加其他错误处理:

    go func() {
            err := handler.HandleMessage(msg)
            // err handling / logging here
    }()
    

    如果您可以有意义地将错误传递给发起呼叫的呼叫站点,那么我更愿意每次都这样做。你需要记住,当你从HandleMessage()回来时,你仍然在一个单独的goroutine中运行。