Ответ 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
, а затем продолжить использовать его методы.