Go 在没有选择器错误的情况下使用包
我正在使用这个名为 我的主要观点是:Go 在没有选择器错误的情况下使用包,go,Go,我正在使用这个名为 我的主要观点是: viper.SetConfigName("development") viper.AddConfigPath("config/settings/") err := viper.ReadInConfig() if err != nil { fmt.Println("viper config read error %v", err) } 然后,我有一个以viper为参数的结构: type MyConfig struct { v *viper.Vip
viper.SetConfigName("development")
viper.AddConfigPath("config/settings/")
err := viper.ReadInConfig()
if err != nil {
fmt.Println("viper config read error %v", err)
}
然后,我有一个以viper为参数的结构:
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
结构包含未报告的字段,您可以像&viper.viper{}
那样创建它,但是viper
包导出一个函数,该函数可用于获取指向新的初始化viper.viper
值的指针。您可以像这样使用它:
vp := viper.New()
myConfig = NewMyConfig(vp)
请注意,
viper
包声明了一个内部的、全局的、未报告的viper.viper
实例。有许多导出的函数与viper.viper
类型的方法相匹配。这些“匹配”函数在全局的、未报告的viper.viper
实例上工作。因此,您可以选择使用viper
包的所有导出全局函数,或者创建自己的viper
实例,然后继续使用其方法。以及main中的内容。转到第55行的?这有帮助吗?如果使用包标识符而未在包中指定项目,则返回的错误是“使用包foo不在选择器中”(@icza第55行是myConfig=NewMyConfig(&viper)
@Blankman&viper
=>viper
是包的名称。您可能想要myConfig=NewMyConfig(viper.New())
。或者,如果您将变量命名为viper
,请更改该名称。@Blankmanviper
是可用于引用包的标识符。v
是包的未报告变量,您不能引用它。您可以使用包名来引用包的导出标识符,例如viper.New()
来调用导出的New()
函数,该函数返回指向新的初始化的viper.viper
结构的指针。这是一个要消化的满嘴内容:P