我正在使用这个名为Viper的配置库
在我的main中,我有:
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
}在我的main中,我有一个函数返回这个MyConfig,如下所示:
func NewMyConfig(v *viper.Viper) *MyConfig {
return &MyConfig{v: v}
}我得到了这个错误:
./main.go:55: use of package viper without selector不确定我该做什么?
发布于 2016-05-03 11:22:55
当你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(),该函数可用于获取指向新的初始化viper.Viper值的指针。你可以像这样使用它:
vp := viper.New()
myConfig = NewMyConfig(vp)请注意,viper包声明了一个内部的、全局的、未导出的viper.Viper“实例”。有许多导出的函数与viper.Viper类型的方法相匹配。这些“匹配”函数作用于全局的、未导出的viper.Viper实例。因此,您可以选择使用viper包的所有导出的全局函数,或者创建自己的Viper实例,然后继续使用它的方法。
https://stackoverflow.com/questions/36994445
复制相似问题