Golang 包和跨包使用变量
Golang packages and using variables across 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)
所以我不知道如何处理来自异步函数的错误,或者如果可能的话。
那么,是否有最佳实践来做我想做的事?
对此的几点思考:
- 在我看来,注入资源(记录器)是最好的方法。直接引用全局变量当然是可能的,但会使您的代码难以更改。
- 如果你 logging.Logger 是具体类型,那么你可以让它在 nil 时工作,这样你就可以跳过测试中的初始化。
- 您绝对可以处理异步调用中的错误。
关于最后一点,您可以使用匿名函数在调用站点添加额外的错误处理:
go func() {
err := handler.HandleMessage(msg)
// err handling / logging here
}()
如果您可以将错误有意义地传递给发起调用的调用站点,那么我更愿意每次都这样做。您确实需要记住,当您从 HandleMessage() 返回时,您仍然 运行 在一个单独的 goroutine 中。
所以我有点想知道这里的最佳实践是什么。
我有一个包含多个子包的应用程序,有些需要访问我在主包中的记录器,因为我使用带有颜色和时间戳等的自定义记录器。
像这样注入是唯一的方法吗? (假设 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)
所以我不知道如何处理来自异步函数的错误,或者如果可能的话。
那么,是否有最佳实践来做我想做的事?
对此的几点思考:
- 在我看来,注入资源(记录器)是最好的方法。直接引用全局变量当然是可能的,但会使您的代码难以更改。
- 如果你 logging.Logger 是具体类型,那么你可以让它在 nil 时工作,这样你就可以跳过测试中的初始化。
- 您绝对可以处理异步调用中的错误。
关于最后一点,您可以使用匿名函数在调用站点添加额外的错误处理:
go func() {
err := handler.HandleMessage(msg)
// err handling / logging here
}()
如果您可以将错误有意义地传递给发起调用的调用站点,那么我更愿意每次都这样做。您确实需要记住,当您从 HandleMessage() 返回时,您仍然 运行 在一个单独的 goroutine 中。