我在应用程序的其他部分有一个运行时配置实例,但它只能在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
这样的字段需要连接数据库的特定实例。
答案 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
}