我正在使用名为Viper
的配置库在我的主要内容中我有这个:
viper.SetConfigName("development")
viper.AddConfigPath("config/settings/")
err := viper.ReadInConfig()
if err != nil {
fmt.Println("viper config read error %v", err)
}
然后我有一个结构,以v蛇作为参数:
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
不确定我该做什么?
答案 0 :(得分:24)
当您import包裹
时import "github.com/spf13/viper"
包名称(在本例中为viper
)将作为新标识符提供给您。您可以使用此标识符构造qualified identifiers以引用包的exported identifiers(以大写字母开头的标识符)。
包名本身不能单独使用。给你错误的那一行:
myConfig = NewMyConfig(&viper)
您使用了包名viper
,但未指定要从包中引用的导出标识符。
您希望使用NewMyConfig()
函数获取指向MyConfig
结构的新值的指针。您的NewMyConfig()
函数需要值*viper.Viper
。由于viper.Viper
结构包含未导出的字段,您可以像&viper.Viper{}
一样创建它,但viper
包导出一个函数viper.New()
,该函数可用于获取指向a的指针。新的,初始化的viper.Viper
值。您可以使用它:
vp := viper.New()
myConfig = NewMyConfig(vp)
请注意,viper
包声明了一个内部的,全局的,未导出的viper.Viper
“实例”。有许多导出的函数与viper.Viper
类型的方法匹配。这些“匹配”函数适用于全局的,未导出的viper.Viper
实例。因此,您可以选择使用viper
包的所有导出的全局函数,或者创建自己的Viper
实例,然后继续使用其方法。