Golang 接口和接收器——需要建议

Golang interfaces and receivers - advice needed

我正在尝试将 Golang 中的配置加载器 class 从特定的配置文件结构转换为更通用的配置文件结构。最初,我用一组特定于程序的变量定义了一个结构,例如:

type WatcherConfig struct {
    FileType   string
    Flag       bool
    OtherType  string
    ConfigPath string
}

然后我用指针接收者定义了两个方法:

func (config *WatcherConfig) LoadConfig(path string) error {}

func (config *WatcherConfig) Reload() error {}

我现在正试图使它更通用,计划是定义一个接口 Config 并在其上定义 LoadConfigReload 方法。然后我可以为每个需要它的模块创建一个带有配置布局的 struct,并让我自己重复一个基本上打开文件、读取 JSON 并将其转储到结构中的方法。

我试过创建接口并定义如下方法:

type Config interface {
    LoadConfig(string) error
}
func (config *Config) LoadConfig(path string) error {}

但这显然会引发错误,因为 Config 不是类型,而是接口。我需要在我的 class 中添加更抽象的 struct 吗? 了解所有配置结构都将具有 ConfigPath 字段可能很有用,因为我将其用于 Reload() 配置。

我很确定我正在以错误的方式处理这个问题,或者我正在尝试做的不是在 Go 中很好地工作的模式。我真的很感激一些建议!

即使您使用 embedding 接口和实现,Config.LoadConfig() 的实现也无法知道嵌入它的类型(例如 WatcherConfig).

最好不要将其作为 methods 来实现,而是作为简单的 helperfactory函数。

你可以这样做:

func LoadConfig(path string, config interface{}) error {
    // Load implementation
    // For example you can unmarshal file content into the config variable (if pointer)
}

func ReloadConfig(config Config) error {
    // Reload implementation
    path := config.Path() // Config interface may have a Path() method
    // for example you can unmarshal file content into the config variable (if pointer)
}