Если мы хотим внедрить лучшие практики для управления нашими файлами conf. Итак, получение переменных из файла conf, а также из окружения. Но многие разработчики не хотят управлять 2 хранилищами информации. Они используются для работы только с одним файлом конфигурации. Итак, чтобы помочь тем, кто не хочет управлять двумя репозиториями…

Мы можем создать такой проект, как:

main.go
config
|- config.development.json
|- config.production.json

На нашем main.go (или в config.go, предназначенном для управления всей конфигурацией)

У нас должна быть структура, представляющая нашу конфигурацию

type Configuration struct {
    Port              int
    Static_Variable   string
    Connection_String string
}

В нашем json-файле у нас есть json, описывающий ключ / значение нашей конфигурации:

{
     "Port": 8080
     "Static_Variable": "static"
}

у нас также будет connection_string, но он будет в переменных окружения.

  • Итак, нам нужно получить информацию из json:
//filename is the path to the json config file
file, err := os.Open(filename) if err != nil {  return err }  
decoder := json.NewDecoder(file) 
err = decoder.Decode(&configuration) 
if err != nil {  return err }
  • и из переменных среды
configuration.Connection_String = os.Getenv("Connection_String")

Если вы не хотите управлять им самостоятельно, вы можете использовать gonfig или viper.

используя gonfig

Гонфиг будет полезен:

  • иметь статический контекст конфигурации, позволяющий иметь всю конфигурацию везде в вашем приложении.
  • есть общий способ определить все переменные env в вашей структуре.

Итак, чтобы использовать gonfig:

$ go get github.com/tkanos/gonfig

тогда вам просто нужно определить свою структуру

type Configuration struct {
    Port              int
    Static_Variable   string
    Connection_String string
}

и отправьте имя файла и структуру в gonfig:

configuration := Configuration{}
err := gonfig.GetConf("path/to/myjonfile.json", &configuration)

Итак, теперь мы можем управлять конфигурацией, как если бы у нас был только один источник конфигурации.

fmt.Println(configuration.Port);

используя Viper

go get github.com/spf13/viper

В вашем коде вам нужно будет объявить свои переменные

var ( 
    Port            string                   
)

Viper сможет читать в файле toml или в переменных env, поэтому, если вы хотите иметь файл конфигурации для своей среды разработки, но использовать переменные env для производства, вы можете написать такой код:

if os.Getenv("ENVIRONMENT") == "DEV" {        
     viper.SetConfigName("config")  
     viper.SetConfigType("toml") 
    viper.AddConfigPath(filepath.Dir(dirname))  
     viper.ReadInConfig() 
} else {  viper.AutomaticEnv() }

А затем инициализировать вашу переменную:

// To add a default value :
viper.SetDefault("APP_PORT", "8080")
//To get from the toml file or env var
Port = viper.GetString("APP_PORT")

Ссылки