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



我有一个包含这两个软件包的GO项目:

  • logging
    导入config,因为我想将当前配置发送到我的错误报告系统
  • config
    导入logging,因为如果程序无法打开配置文件
  • ,我想记录

解决此依赖性错误的最佳实践是什么?

以哪种格式将配置发送到错误报告系统?也许将其传递给伐木?说,如果是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{})
}

最新更新