Golang viper инициализирует файл конфигурации

Я хочу инициализировать (создать и заполнить значениями по умолчанию) файл конфигурации с помощью viper, если он не существует.

Моя попытка заключается в следующем:

func setConfig() {
    usr, _ := user.Current()
    homedir := usr.HomeDir
    v := viper.New()
    v.SetDefault("instance", "acmedev01")
    v.SetDefault("account", "serviceaccount")
    v.SetDefault("password", "svcacctpassword")
    v.SetConfigName("." + filepath.Base(os.Args[0]) + ".cfg")
    v.AddConfigPath(homedir)
    v.SetConfigType("toml")
    err := v.ReadInConfig()
    if _, ok := err.(viper.ConfigFileNotFoundError); ok {
        // Config file not found, initialize config file
        v.SafeWriteConfig()
        //log.Fatal("Please populate config file with appropriate values")
    } else {
        // Config file was found but another error was produced
        checkerr(err)
    }
    fmt.Println(v.ConfigFileUsed())

Кажется, что вышеизложенное не записывает ни одного файла и не дает мне возврата ConfigFileUsed. Должно быть, я упускаю что-то очевидное.

Вам также следует проверить статус ошибки pkg.go.dev/github.com/spf13/viper#SafeWriteConfig

Inian 23.04.2024 16:25
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
0
1
137
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Есть две пинты, на которые следует обратить внимание:

  1. Линия

    ошибка: = v.ReadInConfig()

не возвращает никаких ошибок, если файл не существует, он просто создает новый. Таким образом, выполнение переходит не в блок if, а в else.

  1. И тогда это зависит от того, как реализована функция checkerr() (похоже, эта функция не существует в стандартной библиотеке golang). Если это выглядит так

    func checkerr(e error) { ОС.Выход(0) }

ты никогда не дойдешь до линии

fmt.Println(v.ConfigFileUsed())

на самом деле файл создается в папке пользователя и является скрытым файлом (начинается с .), чтобы увидеть его, просто используйте ls -a в домашнем каталоге пользователя.

Другие вопросы по теме