在没有选择器错误的情况下使用软件包
我正在使用这个名为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
不知道该怎么办?
回答:
当您导入像
import "github.com/spf13/viper"
包名称(viper
在这种情况下)将作为新标识符提供给您。您可以使用此标识符来构造合格的标识符,以引用包的导出标识符(以大写字母开头的标识符)。
程序包名称本身不能使用。出现错误的行:
myConfig = NewMyConfig(&viper)
您使用了包名称,viper
而没有指定要从包中引用的导出标识符。
您想使用NewMyConfig()
函数来获取指向MyConfig
结构新值的指针。您的NewMyConfig()
函数期望值为*viper.Viper
。由于viper.Viper
struct包含未导出的字段,因此您可以像一样创建它&viper.Viper{}
,但是viper
程序包会导出一个函数viper.New()
,该函数可用于获取指向新的初始化viper.Viper
值的指针。您可以像这样使用它:
vp := viper.New()myConfig = NewMyConfig(vp)
请注意,viper
程序包声明了一个内部的,全局的,未导出的viper.Viper
“实例”。有许多与该类型的 方法 匹配的导出 函数
。这些“匹配”功能适用于未导出的全局实例。因此,您可以选择使用包的所有导出的全局函数,或创建自己的实例,然后在以后继续使用其方法。
__viper.Viper``viper.Viper``viper``Viper
以上是 在没有选择器错误的情况下使用软件包 的全部内容, 来源链接: utcz.com/qa/416238.html