从另一个文件在主func中创建的访问运行时配置实例

时间:2017-03-11 22:13:46

标签: go

我在应用程序的其他部分有一个运行时配置实例,但它只能在main()中创建。理想情况下,我想避免使用全局变量。

// main.go
type RuntimeConfig struct {
    db *DatabaseInstance
    app_name string
    ... etc ...
}

func main() {
    dbInstance = ConnectToDB(...args) // returns *DatabaseInstance
    runtimeConfig := *Config{
        dbInstance,
        "My app",
        ... etc ...
    }
}

// elsewhere.go
func SomeUtilityFuncThatNeedsRuntime(i int) int {
    runtime := GetRuntime() // imaginary, magical runtime getter
    db := runtime.DatabaseInstance
    appName := runtime.appName
    db.Save(appName, db, ...)
    return i + 1
}

目前,创建匿名的util函数是不可能的,这些函数可以从访问某些配置变量中获益。如果变量是基本类型(如字符串或int),我可能只是对它们进行硬编码。但是,像dbInstance这样的字段需要连接数据库的特定实例。

2 个答案:

答案 0 :(得分:0)

这看起来像singleton pattern的用例:您的RuntimeConfig是一个应该初始化的结构,它应该存在一个实例,并且应该可以访问它。

答案 1 :(得分:0)

使用私有变量和公共函数(伪代码)创建配置包:

package configuration

type Configuration struct {

}

var config *Configuration = nil

func GetConfig() *Configuration {
    return config
}

func configLoad(filePath string) error {
    config = new(Configuration)

    // load your config from file, fill config structure

    return nil
}

func NewConfig(flags models.ConfigFlags) (*Configuration, error) {
    err := configLoad(flags.Flagconfiguration) // Path of config file.

    if err != nil {
        return nil, err
    }

    return config, nil
}

然后在你的main.go初始化配置:

func main() {
    config, err := configuration.NewConfig(FlagsParameters)
    // use this config variable in main package
}

在其他包中使用:

config := configuration.Config()

作为替代方案,您可以实现单例模式(但我更喜欢它)

type Configuration struct {

}

var config *Configuration
var once sync.Once

func GetConfig() *Configuration {
    once.Do(func() {
        // init your config here. This code will executed once and thread safe
    })

    return config
}