// reload считывает данные с ini-файла и загружает в структуру. При необходимости инициализирует данные значениями по умолчанию func reloadSettings() error { var key *ini.Key var err error var value int defUpdSetDelayInt, _ := strconv.Atoi(defUpdSetDelay) defUpdDataDelayInt, _ := strconv.Atoi(defUpdDataDelay) // открыть ini-файл cf, err = ini.Load(nameIniFile) if err != nil { if os.IsNotExist(err) { // файл с настройками не найден? cf = ini.Empty() // создать новый объект с настройками } else { return err } } // обработать секцию "general" с основными настройками section, err := cf.GetSection("general") if err != nil { section, err = cf.NewSection("general") // секции нет в ini-файле? Тогда создать. if err != nil { return err // если не удалось создать, то продолжать бессмысленно } section.Comment = "Основные настройки" } // перечитывать настройки каждые .... сек key, err = section.GetKey("updsetdelay") if err != nil { key, err = section.NewKey("updsetdelay", defUpdSetDelay) if err != nil { return err } key.Comment = "Перечитывать настройки каждые ... сек." } value = key.RangeInt(defUpdSetDelayInt, 5, 1000000) // значение в пределах 5 - 1000000 секунд. При ошибке инициализация значением по умолчанию key.SetValue(strconv.Itoa(value)) cfstruct.updsetdelay = value // обновлять данные плейлиста каждые .... сек key, err = section.GetKey("upddatadelay") if err != nil { key, err = section.NewKey("upddatadelay", defUpdDataDelay) if err != nil { return err } key.Comment = "Обновлять данные плейлиста каждые ... сек." } value = key.RangeInt(defUpdDataDelayInt, 300, 1000000) // значение в пределах 300 - 1000000 секунд. При ошибке инициализация значением по умолчанию key.SetValue(strconv.Itoa(value)) cfstruct.upddatadelay = value // Имя файла плейлиста и путь до него. key, err = section.GetKey("pathplaylist") if err != nil { key, err = section.NewKey("pathplaylist", defPathPlaylist) if err != nil { return err } key.Comment = "Имя файла плейлиста и путь до него." } cfstruct.pathplaylist = key.String() // Количество параллельных потоков для парсинга сайта key, err = section.GetKey("workers") if err != nil { key, err = section.NewKey("workers", strconv.Itoa(defWorkers)) if err != nil { return err } key.Comment = "Количество параллельных потоков для парсинга сайта. По умолчанию равен кол-ву ядер процессора." } value = key.RangeInt(defWorkers, 1, 100) // значение в пределах 1 - 100 отдельных потоков. При ошибке инициализация значением по умолчанию key.SetValue(strconv.Itoa(value)) cfstruct.workers = value // секция "каналы" section, err = cf.GetSection("channels") if err != nil { section, err = cf.NewSection("channels") // секции нет в ini-файле? Создать секцию. if err != nil { return err } } section.Comment = "Список каналов. Пример строки: -:rossija" // секция содержит список каналов ch := section.Keys() // получить массив списка каналов cfstruct.channels = ch err = cf.SaveTo(nameIniFile) // сохранить файл с значениями по умолчанию if err != nil { return err } return nil }