我正在使用这个名为Viper的配置库
在我的主要内容中我有这个:
viper.SetConfigName("development")
viper.AddConfigPath("config/settings/")
err := viper.ReadInConfig()
if err != nil {
fmt.Println("viper config read error %v", err)
}
Run Code Online (Sandbox Code Playgroud)
然后我有一个结构,以v蛇作为参数:
type MyConfig struct {
v *viper.Viper
}
Run Code Online (Sandbox Code Playgroud)
在我的主要内容中,我有一个返回此MyConfig的函数:
func NewMyConfig(v *viper.Viper) *MyConfig {
return &MyConfig{v: v}
}
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
./main.go:55: use of package viper without selector
Run Code Online (Sandbox Code Playgroud)
不确定我应该做什么?
icz*_*cza 27
当你输入一个包状
import "github.com/spf13/viper"
Run Code Online (Sandbox Code Playgroud)
包名称(viper在本例中为)将作为新标识符提供给您.您可以使用此标识符来构造限定标识符以引用包的导出标识符(以大写字母开头的标识符).
包名本身不能单独使用.给你错误的那一行:
myConfig = NewMyConfig(&viper)
Run Code Online (Sandbox Code Playgroud)
您使用了包名称,viper但未指定要从包中引用的导出标识符.
您希望使用NewMyConfig()函数来获取指向MyConfig结构的新值的指针.您的NewMyConfig()函数期望值为*viper.Viper.由于viper.Viperstruct包含未导出的字段,您可以像创建它一样&viper.Viper{},但是viper包导出一个函数viper.New(),该函数可用于获取指向新的初始化viper.Viper值的指针.您可以像以下一样使用它:
vp := viper.New()
myConfig = NewMyConfig(vp)
Run Code Online (Sandbox Code Playgroud)
请注意,该viper包声明了一个内部的,全局的,未导出的viper.Viper"实例".有许多导出的函数匹配该类型的方法viper.Viper.这些"匹配"函数适用于全局的未导出viper.Viper实例.因此,您可以选择使用包的所有导出的全局函数viper,或者创建自己的Viper实例,然后继续使用其方法.