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
并在其上定义 LoadConfig
和 Reload
方法。然后我可以为每个需要它的模块创建一个带有配置布局的 struct
,并让我自己重复一个基本上打开文件、读取 JSON 并将其转储到结构中的方法。
我试过创建接口并定义如下方法:
type Config interface {
LoadConfig(string) error
}
func (config *Config) LoadConfig(path string) error {}
但这显然会引发错误,因为 Config
不是类型,而是接口。我需要在我的 class 中添加更抽象的 struct
吗? 了解所有配置结构都将具有 ConfigPath
字段可能很有用,因为我将其用于 Reload()
配置。
我很确定我正在以错误的方式处理这个问题,或者我正在尝试做的不是在 Go 中很好地工作的模式。我真的很感激一些建议!
- 我想做的事情在 Go 中可行吗?
- 在 Go 中是个好主意吗?
- 替代的 Go-ism 是什么?
即使您使用 embedding 接口和实现,Config.LoadConfig()
的实现也无法知道嵌入它的类型(例如 WatcherConfig
).
最好不要将其作为 methods 来实现,而是作为简单的 helper 或 factory函数。
你可以这样做:
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)
}
我正在尝试将 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
并在其上定义 LoadConfig
和 Reload
方法。然后我可以为每个需要它的模块创建一个带有配置布局的 struct
,并让我自己重复一个基本上打开文件、读取 JSON 并将其转储到结构中的方法。
我试过创建接口并定义如下方法:
type Config interface {
LoadConfig(string) error
}
func (config *Config) LoadConfig(path string) error {}
但这显然会引发错误,因为 Config
不是类型,而是接口。我需要在我的 class 中添加更抽象的 struct
吗? 了解所有配置结构都将具有 ConfigPath
字段可能很有用,因为我将其用于 Reload()
配置。
我很确定我正在以错误的方式处理这个问题,或者我正在尝试做的不是在 Go 中很好地工作的模式。我真的很感激一些建议!
- 我想做的事情在 Go 中可行吗?
- 在 Go 中是个好主意吗?
- 替代的 Go-ism 是什么?
即使您使用 embedding 接口和实现,Config.LoadConfig()
的实现也无法知道嵌入它的类型(例如 WatcherConfig
).
最好不要将其作为 methods 来实现,而是作为简单的 helper 或 factory函数。
你可以这样做:
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)
}