猿问

解决 Go 中循环依赖的最佳实践

我有一个包含这两个包的 Go 项目:

  • logging
    导入config,因为我想将当前配置发送到我的错误报告系统

  • config
    导入logging,因为如果程序无法打开配置文件,我想记录

解决此依赖性错误的最佳做法是什么?


慕森卡
浏览 149回答 1
1回答

慕妹3242003

您以什么格式将配置发送到错误报告系统?也许将其传递给日志记录?比如说,如果它是 json,那么在将其提供给日志记录之前编组配置,然后[]byte只记录结果。但一般来说,如果两个包直接相互依赖,您可以做的是让其中一个包声明一个与另一个包的行为相匹配的接口,然后让一个单独的包将具体实例作为接口传递。例如:/myapp/configimport "myapp/logging"type Config struct {     // ...}func NewConfig() *Config {    // ...    if err != nil {        logging.LogError(err)    }}/myapp/loggingimport "myapp/config"func LogConfig(c *config.Config) {    // ...}func LogError(err error) {    // ...}因此,在这种情况下,您可以在配置包中声明一个接口,该接口与日志记录所需的行为相匹配。/myapp/configtype Logging interface {    LogError(error)}var logging Loggingfunc SetLogging(l Logging) {    logging = l}type Config struct {     // ...}func NewConfig() *Config {    // ...    if err != nil {        logging.LogError(err)    }}然后让日志包中的一个类型通过简单地委托给原始函数来实现该接口。/myapp/loggingimport "myapp/config"func LogConfig(c *config.Config) {    // ...}func LogError(err error) {    // ...}type Logging struct{}func (Logging) LogError(err error) {    LogError(err)}最后还有第三个包使它们一起工作。/myappimport "myapp/config"import "myapp/logging"func init() {    config.SetLogging(logging.Logging{})}
随时随地看视频慕课网APP

相关分类

Go
我要回答