如何处理多个配置

时间:2018-03-27 13:42:00

标签: go

有没有一种好方法可以重用代码来读取不同的配置?

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
}
  1. 我可以在Config1 / Config2中重用LoadConfig吗?
  2. 我可以设计像singleton这样的对象来创建一次Config1 / Config2。

2 个答案:

答案 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
}