Go实战全家桶之一:goconfig 依赖注入实现单例、泛型实现简单工厂模式、工业级巨匠
package main
import (
"fmt"
"github.com/Unknwon/goconfig"
"github.com/pkg/errors"
"os"
)
// 配置管理器接口
type ConfigManager interface {
GetValue(section, key string) (string, error)
}
// 配置管理器的实现
type configManager struct {
cfg *goconfig.ConfigFile
}
func (cm *configManager) GetValue(section, key string) (string, error) {
if cm.cfg == nil {
return "", errors.New("配置文件未初始化")
}
return cm.cfg.GetValue(section, key)
}
// 配置管理器单例
func NewConfigManager(configFile string) (ConfigManager, error) {
cfg, err := goconfig.LoadConfigFile(configFile)
if err != nil {
return nil, errors.Wrap(err, "加载配置文件失败")
}
return &configManager{cfg: cfg}, nil
}
func main() {
configFile := "config.ini"
if _, err := os.Stat(configFile); os.IsNotExist(err) {
fmt.Printf("配置文件 %s 不存在\n", configFile)
return
}
// 通过工厂方法获取配置管理器单例
config, err := NewConfigManager(configFile)
if err != nil {
fmt.Println(err)
return
}
// 使用配置管理器获取配置值
value, err := config.GetValue("section", "key")
if err != nil {
fmt.Println(err)
return
}
fmt.Println("获取的配置值:", value)
}
这段代码首先定义了一个ConfigManager
接口,然后实现了这个接口的configManager
结构体。NewConfigManager
函数负责创建configManager
的单例,并加载配置文件。在main
函数中,我们通过NewConfigManager
函数获取配置管理器单例,并使用它来获取指定的配置值。这个例子展示了如何使用接口和单例模式来管理配置信息,同时也是工厂模式的一个简单实现。
评论已关闭