Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 在没有选择器错误的情况下使用包_Go - Fatal编程技术网

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
,请更改该名称。@Blankman
viper
是可用于引用包的标识符。
v
是包的未报告变量,您不能引用它。您可以使用包名来引用包的导出标识符,例如
viper.New()
来调用导出的
New()
函数,该函数返回指向新的初始化的
viper.viper
结构的指针。这是一个要消化的满嘴内容:P