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

时间:2015-04-07 09:56:16

标签: interface go abstraction

我试图将Golang中的配置加载程序类从特定的配置文件结构转换为更常规的配置文件结构。最初,我使用一组特定于程序的变量定义了一个结构,例如:

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不是一种类型,它是一个界面。我是否需要在课程中添加更抽象的struct了解所有配置结构将包含ConfigPath字段可能很有用,因为我将其用于Reload()配置。

我非常确定我会以错误的方式解决这个问题,或者我尝试做的事情并不是一个在Go中运行良好的模式。我真的很感激一些建议!

  • 我试图在Go中做什么?
  • Go中的好主意吗?
  • Go-ism的另类选择是什么?

1 个答案:

答案 0 :(得分:3)

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

最好不要将其作为方法实现,而是将其作为简单的帮助工厂函数实现。

你可以这样做:

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)
}