有没有一种好方法可以重用代码来读取不同的配置?
btw:我使用的配置文件是configor
代码可能就像,
type Config1 struct {
//some config items
}
type Config2 struct {
//some config items
}
func LoadConfig1() Config1 {
var c Config1
configor.Load(&c, "MY/CONFIG1/PATH")
return c
}
func LoadConfig1() Config2 {
var c Config2
configor.Load(&c, "MY/CONFIG2/PATH")
return c
}
singleton
这样的对象来创建一次Config1 / Config2。答案 0 :(得分:2)
使用sync
包确保配置仅加载一次。
示例:
import "sync"
var (
c Config1
once sync.Once
loadFunc = func() {
configor.Load(&c, "MY/CONFIG1/PATH")
}
)
func LoadConfig() Config1 {
once.Do(loadFunc)
return c
}
对LoadConfig
的任何后续调用都将被忽略。例如:
func main() {
c1 := LoadConfig() // Loaded, returns the value
c2 := LoadConfig() // Not loaded, returns the first loaded value
c3 := LoadConfig() // Not loaded, returns the first loaded value
}
答案 1 :(得分:1)
以上代码无效。它会抛出一个错误
在此块中重新声明LoadConfig
由于
Go不允许创建具有相同名称的函数。我们可以创造 同名的方法有不同的接收者。
使用相同的方法名称为config1和config2创建接收器。
type Config1 struct {
//some config items
}
type Config2 struct {
//some config items
}
func (config1 *Config1) LoadConfig() {
configor.Load(config1, "MY/CONFIG1/PATH")
}
func (config2 *Config2) LoadConfig() {
configor.Load(config2, "MY/CONFIG2/PATH")
}
每次创建一个函数来创建一个对象,以检查实例是否已经存在。
type Config1 struct {
}
var instance *Config1
func GetInstance() *Config1 {
if instance == nil {
instance = &Config1{} // <--- NOT THREAD SAFE
}
return instance
}