Получение пакета без ошибки выбора

Я использую эту конфигурационную библиотеку под названием Viper

В моем основном я это:

viper.SetConfigName("development")
viper.AddConfigPath("config/settings/")
err := viper.ReadInConfig()
if err != nil {
    fmt.Println("viper config read error %v", err)
}

Затем у меня есть структура, которая берет гадюку в качестве параметра:

type MyConfig struct {
  v *viper.Viper
}

В моей основе у меня есть функция, которая возвращает этот MyConfig как:

func NewMyConfig(v *viper.Viper) *MyConfig {
    return &MyConfig{v: v}
}

Я получаю эту ошибку:

./main.go:55: use of package viper without selector

Не уверен, что я должен делать?

Ответ 1

Когда вы import пакет, например

import "github.com/spf13/viper"

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

Само название пакета нельзя использовать. Строка, которая дает вам ошибку:

myConfig = NewMyConfig(&viper)

Вы использовали имя пакета viper без указания того, какой экспортированный идентификатор вы хотите ссылаться в пакете.

Вы хотите использовать функцию NewMyConfig() для получения указателя на новое значение структуры MyConfig. Функция NewMyConfig() ожидает значение *viper.Viper. Поскольку структура viper.Viper содержит нераспределенные поля, вы можете просто создать ее как &viper.Viper{}, но пакет viper экспортирует функцию viper.New(), который можно использовать для получения указателя на новое инициализированное значение viper.Viper. Вы можете использовать его как:

vp := viper.New()
myConfig = NewMyConfig(vp)

Обратите внимание, что пакет viper объявляет внутренний, глобальный, неэкспортированный viper.Viper "экземпляр". Существует множество экспортируемых функций, соответствующих методам типа viper.Viper. Эти "соответствующие" функции работают с глобальным, неэкспонированным экземпляром viper.Viper. Таким образом, вы можете использовать все экспортированные глобальные функции пакета viper или создать свой собственный экземпляр viper, а затем продолжить использовать его методы.