为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕森卡 2023-06-12 15:51:50
我有一个包含这两个包的 Go 项目:logging导入config,因为我想将当前配置发送到我的错误报告系统config导入logging,因为如果程序无法打开配置文件,我想记录解决此依赖性错误的最佳做法是什么?
查看完整描述

1 回答

?
慕妹3242003

TA贡献1824条经验 获得超6个赞

您以什么格式将配置发送到错误报告系统?也许将其传递给日志记录?比如说,如果它是 json,那么在将其提供给日志记录之前编组配置,然后[]byte只记录结果。


但一般来说,如果两个包直接相互依赖,您可以做的是让其中一个包声明一个与另一个包的行为相匹配的接口,然后让一个单独的包将具体实例作为接口传递。


例如:


/myapp/config


import "myapp/logging"


type Config struct {

     // ...

}


func NewConfig() *Config {

    // ...

    if err != nil {

        logging.LogError(err)

    }

}

/myapp/logging


import "myapp/config"


func LogConfig(c *config.Config) {

    // ...

}


func LogError(err error) {

    // ...

}

因此,在这种情况下,您可以在配置包中声明一个接口,该接口与日志记录所需的行为相匹配。


/myapp/config


type Logging interface {

    LogError(error)

}


var logging Logging


func SetLogging(l Logging) {

    logging = l

}


type Config struct {

     // ...

}


func NewConfig() *Config {

    // ...

    if err != nil {

        logging.LogError(err)

    }

}

然后让日志包中的一个类型通过简单地委托给原始函数来实现该接口。


/myapp/logging


import "myapp/config"


func LogConfig(c *config.Config) {

    // ...

}


func LogError(err error) {

    // ...

}


type Logging struct{}


func (Logging) LogError(err error) {

    LogError(err)

}

最后还有第三个包使它们一起工作。


/myapp


import "myapp/config"

import "myapp/logging"


func init() {

    config.SetLogging(logging.Logging{})

}


查看完整回答
反对 回复 2023-06-12
  • 1 回答
  • 0 关注
  • 148 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信