Обычная задача — есть конфиг нашей программы в каком-нибудь файле и нам надо его загрузить для последующего использования. Конфиги сейчас можно хранить в чём-нибудь вроде YAML или хотя бы JSON или XML. Допустим, наш в ямле.
1 2 3 4 |
option1: string value 1 option2: - option3: string value 3 - option4: 4 |
В отличие от JSON и XML, для YAML официального пакета пока нет. Поэтому гуглим и находим нужное.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import "gopkg.in/yaml.v2" type Option2 struct { Option3 string `yaml:"option3"` Option4 int `yaml:"option4"` } type Config struct { Option1 string `yaml:"option1"` Option2 Option2 `yaml:"option2"` } configData, err := ioutil.ReadFile(configFilename) if err != nil { log.Fatalf("error: %v", err) } conf = Config{} err = yaml.Unmarshal(configData, &conf) if err != nil { log.Fatalf("error: %v", err) } |
То есть, нам надо в коде явно описать структуру данных из конфига с указанием, какие поля на какие опции в конфиге маппятся, и затем уже загружать конфиг. Заметьте, что все загружаемые поля должны начинаться в структурах с большой буквы.
Аналогичным образом и с другими форматами. Если надо, чтобы конфиг мог загружаться/выгружаться сразу в несколько форматов, то маппинг должен содержать все нужные описания. Например, для поддерки ямла и джейсона маппинг будет выглядеть примерно так — yaml:"option1" json:"option1"
.