我试图设置一个配置结构,通过我的应用程序使用。
目前,我加载了一个yaml文件,并在我的配置结构体中对其进行解码。
一个月一次
database_url: postgres://postgres:@localhost:5432/database_dev
一米一分一秒
import (
"os"
"gopkg.in/yaml.v2"
)
type AppConfig struct {
DatabaseUrl string `yaml:"database_url"`
}
func LoadConfig() *AppConfig {
appConfig := &AppConfig{}
file, _ := os.Open("config.yml")
defer f.Close()
decoder := yaml.NewDecoder(file)
decoder.Decode(config)
return appConfig
}
它工作得非常好,但是现在我需要根据环境(测试、本地、生产等)设置不同的配置。
我认为可以使用嵌套的yaml文件来声明环境变量。
config.yml
dev:
database_url: postgres://postgres:@localhost:5432/database_dev
test:
database_url: postgres://postgres:@localhost:5432/database_test
我想在LoadConfig
函数中接收环境作为参数,并得到正确的配置,但是我不知道怎么做。
config.go
type configFile struct {
Dev struct { AppConfig }`yaml:"dev"`
Test struct { AppConfig }`yaml:"test"`
}
func LoadConfig(env string) *AppConfig {
appConfig := &AppConfig{}
configFile := &configFile{}
file, _ := os.Open("config.yml")
defer f.Close()
decoder := yaml.NewDecoder(file)
decoder.Decode(configFile)
// How to get the correct struct here ?
// config = configFile["env"]
// It doesn't works
// invalid operation: cannot index configFile (variable of type *configFile)
return appConfig
}
欢迎提出任何建议。
1条答案
按热度按时间shyt4zoc1#
如果环境列表是任意的,那么您不希望顶层使用
struct
;你需要一个map[string]AppConfig
。它看起来像这样:假设我们从您的问题中得到了
config.yml
,我们可以在不同的环境中运行上面的示例,并看到所需的输出: